{"_id":"drizzle-orm-pg","_rev":"282-4c8d4ec0ad07f32832d83c284625f812","name":"drizzle-orm-pg","dist-tags":{"latest":"0.16.3","update-table-api":"0.14.1-bad61c5","pipeline-add-mysql":"0.14.2-3967f06","docs-1":"0.14.2-c7344a5","AndriiSherman-patch-1":"0.14.3-314c1fa","feature/index-name":"0.15.0-67805d4","feature/pg-aws-dataapi":"0.15.2-2b4d90d","beta":"0.16.0-3e17d6e","feature/sqlite-wasm":"0.16.2-43776eb"},"versions":{"0.12.0-beta.0":{"name":"drizzle-orm-pg","version":"0.12.0-beta.0","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","type-fest":"^2.16.0","typescript":"4.8.0-beta","uvu":"^0.5.3"},"scripts":{"build":"tsc && resolve-tspaths","pack":"cp 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.0","_integrity":"sha512-SPH495CSoPqHr9L8RPwJaKhPr9VizFjTPCFYd6M2APn6LZ2hrW038rAP5ogZvpOGm3gegchn9foDWX30f8pMAw==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-SPH495CSoPqHr9L8RPwJaKhPr9VizFjTPCFYd6M2APn6LZ2hrW038rAP5ogZvpOGm3gegchn9foDWX30f8pMAw==","shasum":"54f164a8363c3e344c2d0cfdda069dcedf3451fc","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.0.tgz","fileCount":121,"unpackedSize":185644,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBBWqv2t4rMmTprdUfSXGW4hGPUrTBIU2dHGjV/02iPpAiEAm4sV1ETEgVAkxbeZQucIYE1VRNzbonmeX+3oGjI00/s="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi63bBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq7dRAAljF8xPktg8gS0MU/3PhOf54DgO5WMBlWi7IzjdaqvHdCidg7\r\nk2bVrlMbYKVNa2e+wEIDb49qDOq28nGUYm6V+o8SMRIH/m3siNkxOGoM8FTE\r\neKTN/j9kXGsg9TMbmgaJBUJgvjc2NbPLQD4/OZlL8GqqeGY5gDZ8bGG4Ipn+\r\n2BEzrxcrd54Zf6q6nBfzD8i9kLnZ8Dif6JcETagAhOT/dDY+slyZkzvtF61l\r\nG2QypnXw5GsEqGc6nhdHPIKGheohuE/t8LEHrUoOUzQkgKwxP37BAM3EI+WI\r\nbHzHR0rFnEsI/LgzXAKpzBPAlhdHLPR+7oL4zJVjis0dByHuMLlFMj/hlIdq\r\n3dN0rMOShJJmvlRr4i1oLqqERvJYwslszy4Yb88qoaemPRmcWlqw7cXDba87\r\nVprqg2Ndq5nGQnBrJ7n1lD3fA/TUJcjxa1gqu41ahBC6fwXw87lqk+toHsuv\r\ncfbWPp31IWRVdm3rdTynP0Itevo8Jjpwro1sKNTh6GZDKfDdCJVC5XsBJgx6\r\nDc40aSNTYnUY6iAQLsfadH+Ny+6vC/Yut9txaL26qMxTeCz/1sMRCwzys5Ur\r\n7KObvuMsA1yxc92Dmbh7o2VVqiUUIHYEBwoZu122vW4/9zs30h61INJdjEBK\r\ncpP94DWA9LVhYST54YdaIru438a5CPYSaeg=\r\n=l5Lb\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-pg_0.12.0-beta.0_1659598529239_0.4325291981199917"},"_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.1":{"name":"drizzle-orm-pg","version":"0.12.0-beta.1","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","tsconfig-paths":"^4.0.0","type-fest":"^2.16.0","typescript":"4.8.0-beta","uvu":"^0.5.3"},"scripts":{"build":"tsc && resolve-tspaths","pack":"cp 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.1","_integrity":"sha512-4wuG8O1sB5HdYZPXhCkgmg8/5T3z/+eK7lrtsY6cYoyFTJRLRQvQyBTRfELTXpd6S9bBZAqtdltd+YTgWPZQvA==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-4wuG8O1sB5HdYZPXhCkgmg8/5T3z/+eK7lrtsY6cYoyFTJRLRQvQyBTRfELTXpd6S9bBZAqtdltd+YTgWPZQvA==","shasum":"9d32f53b7c7ee900c69697646fa09efe6e6b60d6","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.1.tgz","fileCount":124,"unpackedSize":205355,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID6CuEXJ9lmeDZCsCefzteEEmNWgOi6PyIXJtd7sajoKAiA0vHT0FB5MbZajeDq/GT7LmyKbia2G2TRW+d5b1NZuGQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi64efACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmprlw/+Pp+jN/gNo2QcnGmWiJqvg0TR864TDG3V7+rw/4OCi8szQmLs\r\nMOfwtTH8EHGj1TksrLc9Wh1M+xBXDmwlE9F5YNcMx6m2oyhxuqrcB7lUpaS/\r\nOwoRKzbsgLyC7mL/otmxBJkCIS/dy4pD7oMkoG/NJTjLESM1oO1+SKuOEW19\r\nmOHuyu8PWD/Zo3lNasdLYjRwWnwew5fEzkAP/KPIhx1nPKCEXTTFmPOObJh0\r\nNQ6VAIUf6I+fRQaR7PkhKNAobUTSXr0zMZvouP/+AlntXyVMs6Dct8pMwN6A\r\n9oz1LIS5U6UUWyoXlCugKMaVwuBGQKrhRrAvEwjIsnzzvAlwL31KaoZ9pMH2\r\nbNHJZ/clePwMKxhSuL5hYkeQZCfQsjRoDvaV90SdsqQuTCkbDAGtdXD5YEiz\r\n92b75kzOPQLUfBPTr+2D2a4XJNyp5A67Du8VPK1H7JJaAlTwaNfCYXkdALlo\r\n8uRUUKd2SyuLmJQkEnddTtPydbYvoPJlvBAFvrQ3Etj8ec9dNOTI5TiAUSSH\r\ndOb4Bm/PQEsCDxwOyc6ikEAZDg4cNWJZpSAyy9QkVjJWaG5E8fwULtwgoJrb\r\n2OQF6ICuobDKJRi4hJ0V0DREC8LBnBc9VJP3XZdh8zcrnZz2BfzN1OSu43sB\r\nKun2sl+dVpzysJJkvfwdQXEHgE52IE88gZU=\r\n=oQca\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-pg_0.12.0-beta.1_1659602846948_0.32723757948055443"},"_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-pg","version":"0.12.0-beta.2","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","tsconfig-paths":"^4.0.0","type-fest":"^2.16.0","typescript":"4.8.0-beta","uvu":"^0.5.3"},"scripts":{"build":"tsc && resolve-tspaths","pack":"cp 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.2","_integrity":"sha512-hNQfTgHm3FkJvBK4AJsCt2jLZKUUnibIjUE2OsExuv4lBrWqwyG9mmJusVxvJOrB9ZDZiFhVrKy3bxks+zhXHA==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-hNQfTgHm3FkJvBK4AJsCt2jLZKUUnibIjUE2OsExuv4lBrWqwyG9mmJusVxvJOrB9ZDZiFhVrKy3bxks+zhXHA==","shasum":"0432913fc28a4f6ddc47956958a538cf8e2950b0","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.2.tgz","fileCount":124,"unpackedSize":205072,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDy9UeKmqWy4Q05/w/SIZbKGkMB6QStdkdPKl16zNtrUgIhAI/JlOD6+4m1/e4zjx62j3afAfz0HzxP5o31/hV7mQi8"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi68oZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqjGhAAi/oZiDBMEpw0OgqoE6RCfhbOVdQzvZGEFmVH2pA2h9KaPnG6\r\nlBSqGjEbEBXzwLPXHfbrEqr5eCpvRkWLi+7C6eM5HoYTKQKhmOp/BYOmtIyP\r\n2XoDTOHEx8hv/mRVF94F156xw13x4s7isIHKWT72Eh7bprPl1a6imbnACMiy\r\nxDk3k9d5i5B9GfMOgjeLbbegO4ke1/6ar4hp4BSs9XOTBT9BC/WOPwTfYpV2\r\nnQkUw9OzNCvChkHY9880A59YufEPsPcyulLCz+qA0ji4N2Wop3j9PNMCPPAA\r\nuUuJobmWEn6HXELpXFQmGzH6Rto587VbQGCiat594DpZKxCnoSq3EzbnBZKy\r\nVCGVw8vpzHDIYqlRXocjxfYRi4Byab7Tuk2m0DI5r1dbsp6DOkt4/+WNB40s\r\nCPihanPrzwETPbsqxyR2jfYaXl6YUTdnEWMQl2B+6wjtTdlKBg9/5aWewwf9\r\nVJd8kX4tXTXNdN1a3/w5DFtOsPdwWhK6P+nUiwUZYdDTQZ6sE3ojRWanm8ox\r\nLKQM1sDJbSsbpXXvC9HUN1AUvA6ys4FCow0Py7eucdON4y7ZhIOZOWJVpoKY\r\nH9Ugrt5e2N/VoF6WXcSPSbqJ70j63LyGc4d9fpVdsYu8DnqZgSc+5iJazSGx\r\n4wR9IfqkdlU084k3SCaunci11Yn+C92zjcI=\r\n=XFbK\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-pg_0.12.0-beta.2_1659619865328_0.8209252196997381"},"_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-pg","version":"0.12.0-beta.3","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","tsconfig-paths":"^4.0.0","type-fest":"^2.16.0","typescript":"4.8.0-beta","uvu":"^0.5.3"},"scripts":{"build":"tsc && resolve-tspaths","pack":"cp 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.3","_integrity":"sha512-ezorn2TVSrb+UKpn8AgMVOst7bo/ap5rgzZPcDU5bIVUou/hYtzN5329VV236oRKLPBqL80+/CmtVnfyStEbcw==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-ezorn2TVSrb+UKpn8AgMVOst7bo/ap5rgzZPcDU5bIVUou/hYtzN5329VV236oRKLPBqL80+/CmtVnfyStEbcw==","shasum":"27ba9001f0d1ce8ff1126bb53bff962b00ca9724","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.3.tgz","fileCount":124,"unpackedSize":206101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDZyHPgnWpI1UssI4UOk9gnJLexov0InAeEqX4mTJRBOAIgNeWc548oCkKxWXf6txpg7zgfDW8yRAuKStKQtqaPtnY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi69YSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqsvRAAnUKS/QfarMthuKBew5f4PJr/WO15OGqR/uxxEe/y0qKoP3wB\r\nER/ho5rrd9sRoeICSlvwzRhDaQYzW165/40muvr1m7WeF9VHgu1xBygjwbhb\r\nuPzeVjx4EyGDBn/kL2ah+iQ5Z+ztUmckvWK2O6LurOpXkCrglkhywKpJ7YWc\r\nXbZrN4yO+YKdg+2SyQ2Bi6NUxCGvUwg9356aMCOghSRZHomfbz2L0YKjOJDH\r\nU4gPeLANOCeHuEixIjVfgUvvfNTqYSBOJfWVbcOEcWTGeVkFm96NfukVcW1E\r\nWj7oaO1JEVw/wpOHNoaxm0RopJnYgX1uh6MV1sVautHCCvSTPQN9RVGpFt/c\r\nW6v8gFOuajZhg/kx+aWNWLPEZAJtktXozjglNRBd59yHx2lGXGMj2+LfUGbl\r\n53LMzpDWIVO4QEG//TjE34z/EmKs1AbqMrK+H2Y2mVXtdDhXjR5Zhm4AFxyh\r\nPenlFuTh+9bPJRatKhVl0JrotceUv4einQA3xar4LEs3uQuhHvO4gJgYwGG6\r\ng0y3SMariX3WE4c2DydjYxCzleofvELreYTkxX05zm5jkC8CElhBuzUqRt/x\r\nfhF1o4r4xhvcS5hzaJvO+sUTnUufCFnqlT3gaR9OouwizxEV7wmgtUc7UcmX\r\nJPEZLfE5h3gw1OP4KAcS6A4pa4hmINo4mE4=\r\n=Jqu3\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-pg_0.12.0-beta.3_1659622930496_0.7694268240313007"},"_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-pg","version":"0.12.0-beta.4","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","tsconfig-paths":"^4.0.0","type-fest":"^2.16.0","typescript":"4.8.0-beta","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 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.4","_integrity":"sha512-0aTgvRn25far7YrDb+atI1Nc4F1zbA3EyXt6gFfqQIescDVjJgdbAwZHQvQLA5Rv2/dfXUCZLd6xJnolHTUa8w==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-0aTgvRn25far7YrDb+atI1Nc4F1zbA3EyXt6gFfqQIescDVjJgdbAwZHQvQLA5Rv2/dfXUCZLd6xJnolHTUa8w==","shasum":"696a8927a2174973f87de2c09037377a4f405429","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.4.tgz","fileCount":261,"unpackedSize":524923,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE+21/zXDN8Nv/dfxFt/iPdnyxlbe1yg3/wpnohEBzTKAiBxYcivksFhaC4nxd+X1v3FzVUf+99LovCezXt3ZxQAiw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8Rg3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqoZg//Q1xd7+6yhsBiAcmfffrNukTFL9auhprZAZW3kPuxZl3OX7ra\r\nVti7b42J0klBnQQOEo9LU613/YO1xixzRasTkbKWvIHENyJaQ4K1/fsgo+0U\r\nanBvXOFhs3LINCjnn7V2vBbOA1ey8FLred1T2FrXJXXp2cH7QY8AWY3Jrx2b\r\nFuyUnSDolFslL6p19wm8Nv4cGMCpeHOZS507uxSS+RG80m1GdKkfP4lSLb2e\r\nqmEPqrtrxbyTg3SmqgLN72l8fLK/cg5Zemm7XIy/fp568uj/um4XqOgp4Bff\r\nL22cTGLWX8J1iBPRLn7DkAr+T8EDVPdqqrHBq/KRqNmIiStDN07h0qijhg/2\r\n3m+6SRKUbUZw1/+jsADp7BNZpIKhERTLXIqOF/5/7950rFEzJVssXkwcFwLs\r\nZX7GGZcEvKgzCRIM0woD58cukueN2ffb+YQXypblqTbuVs3lUlJurwwnHzco\r\ne+HpbYlMwou7knPaC82yDK3dnAe5notM1TGa1MdhUd2kbg8W8ro/vBzjcL98\r\nwwzumAwvJmEwbpdYbX9M2DRwdjNjiJSr2dl5JXusI1nbsefPNgz8OwvyplaY\r\nj7jJYpIKlgxii1BKzlAlwrlOqj+wc7o3fLk1I1gAqx5qOWp4o4Iy/WbNn2jE\r\nxwROGc6x2Ox3Jyeh5RmCL5OMXivThOa7mbM=\r\n=YriO\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-pg_0.12.0-beta.4_1659967543782_0.9658275795172604"},"_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-pg","version":"0.12.0-beta.5","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","tsconfig-paths":"^4.0.0","type-fest":"^2.16.0","typescript":"4.8.0-beta","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 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.5","_integrity":"sha512-x+pShaLqXu2H4Q7v6lqq8y599mXWeQRx1cfZdE2fRV/OEKUpl7vSZRtNNJ8TQIQ5SLuvS+GM7dm2pO++zVW8Kw==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-x+pShaLqXu2H4Q7v6lqq8y599mXWeQRx1cfZdE2fRV/OEKUpl7vSZRtNNJ8TQIQ5SLuvS+GM7dm2pO++zVW8Kw==","shasum":"64f81b53092541f110a9d979e2a198a4e5ca544d","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.5.tgz","fileCount":121,"unpackedSize":188431,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBYTX8XCDzCdfDKHhMEzlhZ47zdFn3iGXFAq8qmhnjnMAiB2dL2XeCL/JF5AVZe83nvWZn8o9flG+ARGpBySiTrPZQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8R8vACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoGeA//caQf7Er3bdzfmk/KhK8/siFfrETGXX31fv1xnBOd7h+VM2/K\r\nPn42vYEJ7lxeQ+ZPzskRMpmdCov17ghGyD6GoRLFGxiD64o3TO8C5oCNK7lh\r\nw65isN2q+0jlvdk0+c+3Oe1vY0WvafJs0uEqPj+2QsGOxApWIWdbYq46BRHR\r\nBT0x6SAtOZmhFbIKgsV2R3vGVTnUkLkhUnRFA0ZRKj5BeRdDz0JLbT6yY68O\r\njLXDTB35PimcUj/jtgLoGGRJJAMjGHix3S0Xh1NpwI2JEEP1UtsW8oj9WLxF\r\nAD4rhQSDITa8/Q09edLAh40okxbGRXv7baTTfGM4B7avWiX3D1E5NwnBAerY\r\nmctxSdL3dQFN8cgBOwO1xcNsC2fdnmsu9nqIHSDa4ziQv3OihsrHN+XD1RZd\r\nEqxoyIJqdt6ufO6HqKEonXeO2qUfGICI0t+BhMZn55ANrhezicYKAvfj4/0F\r\no0NMhrMmYyXadITWPrmFordvNLSlx2vU6mE00i82rXD1Ez51lqeuQAx6q82F\r\n3ez4gHNVRXnnrrs42x8EZx8mPaYIg+rJ+bwUj+P1nkpiib3Vbzlfy8e4uBBG\r\nBu487Wc05vNDdMvNaeOANfA4nA56ydiDmOGYGMoa7/x0Q4LRYiseDJFXU9qV\r\nuep8hOIKnc+Nz7849Kxacq7sl6UAYZd9Yv4=\r\n=dHP+\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-pg_0.12.0-beta.5_1659969327803_0.9957573569341387"},"_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-pg","version":"0.12.0-beta.6","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","tsconfig-paths":"^4.0.0","type-fest":"^2.16.0","typescript":"4.8.0-beta","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 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.6","_integrity":"sha512-beoO9Qq27h8i60JKAM+w798QBI4jZoB/w7oj4zUMGpTb9cRoA+7eQPVPhXvu3JLO8lX5XKEI2J/CQhLoI30bZw==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-beoO9Qq27h8i60JKAM+w798QBI4jZoB/w7oj4zUMGpTb9cRoA+7eQPVPhXvu3JLO8lX5XKEI2J/CQhLoI30bZw==","shasum":"643707146a96a406ac0b4536de6e835b55598281","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.6.tgz","fileCount":139,"unpackedSize":203645,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCT4JnC5OUDSyFaE7SRhWjgeQWuo6a1ZIvWQhiV2ijUgQIhAKHX6a2RR3f3ApT1Hov/cu6wa6vnv2yP+A5LY3IcuvlK"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjBRcuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmowBQ/5AFUB37OXhC1b4U3aVmc/dz08vHzwgqoEpxQ3B+DwXCr4WYis\r\nc3IdWubLeMmw2Fnieb89WQ8P7Ye5IUufHRSBUoP+IyO5rUqc4qc5uS4ZfCMd\r\n5HCQRq5J4iBsSXJKW7Jz6WJXPYX5Q5UHs00cecbpyPsmZ3rUSAkBAVfOdVBM\r\n28owfnxGkNZsEG3hzfaZpWnhkv4e3h9e8boxDMlMcwGYrm95R0cdvCuYZcIa\r\nZ7z4kCbCqS24lWqQAVJpz3Qgf5fLzyE/dWVxs+Sxilqkm5k/o7Ez5jtzzkBB\r\nGGC3o3nR1MFablh9DhkSV/yugIVJwBOBk0ArMRxKRQCdl7pXUpXK/zeI0M3o\r\nH4ii691onva6QbysFHnfDxuJmwPHwWk1KxN59RXyhjEZIfITW8L2KdDGn6Dk\r\n8jK3EWvRf1Po2OspLoCVSc24Ha3Fe0G1sybnEDW4xil3jXvjs3UAs5ps/eUk\r\nLCCvi1XVXdfGi04kSUh4WWfi3W69LwJmcow+sV7rGpnSxR+iIJzJjz5nJIl3\r\nl2LwsR0J8oicAzd9eOusntdcNllmsHRoN1ZUm94l8nQY9LBVMRn7Q4j36p2F\r\nd0ZNyW7GASvRaXZaFoe0NdjsmSi9scwgVm026/SjKkZ3vWMHp0BTwcehjBgk\r\nvWLoverQF6y9YiWhT3+MbUP/9AW1aHwZ+Xw=\r\n=u9LC\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-pg_0.12.0-beta.6_1661277998678_0.8931511865682609"},"_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-pg","version":"0.12.0-beta.7","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","tsconfig-paths":"^4.0.0","type-fest":"^2.16.0","typescript":"4.8.0-beta","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 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.7","_integrity":"sha512-diDABan1Hue0zILhCiDXWTvNjHsGfL9KdNil8RKvN0movp62SCYTM9xqxSzGhaDgbspElcsRlWoq+wDfWKRIQA==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-diDABan1Hue0zILhCiDXWTvNjHsGfL9KdNil8RKvN0movp62SCYTM9xqxSzGhaDgbspElcsRlWoq+wDfWKRIQA==","shasum":"9977b90ae2dad006368422154d691ecd6a9aa7a5","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.7.tgz","fileCount":139,"unpackedSize":203629,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCNifRi3ngSTKcPpUQyo7t77lmUMt6A5QLxBQ1K0HJtXQIgFSTY3Wfy7RW/u9G04tPF0QviYB4+41nj3TAyr8TVt7g="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjBTp2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqBZw/+OQuLWMl2HURsVd2q/rAXyPOJOJ5rL7iGchd02GpIq78rnNPH\r\nYQ6q6uFPF56FfrloOOmdPnMbEojNXGlcjEjTNXFSugVGc7TnISq/JXlvAfZV\r\n8Bbmd7/UE0i39ETgh2F9jrIIj5D+nKL/4a3iuFoJp7N3cLaJr03vUj1J/gNz\r\nAshp7wQkYs/UFoV8KITHBaMXHBEf/QSHZu9Citc8yJNDPSGVUqCONQf28JcO\r\nxfX6gATK8rHrogV9JPqg5sQg6kVCrIiLAHeu/ZqypqJnCiDoOffe08clU91P\r\ngK4EWDT61fasccaO/0u2sEX7EC6TRdThwa1Dw+hq+SuIPR32+/YdQYew1w3S\r\nOMPN2I8q6d4OuVqRNqtSobZv0HRbOM01nPbkwAGe8/JUzMUhFGSKxqPdtbT5\r\n7hyZdsgFlQ033XAWD5MkKr9N6QICb4NsSZQGY8Zn04rI+rkrQCs2tLjrbGqQ\r\nrMZwUmBpQJWPY6dG60fvecwfzGqRIYbxdwbDPMNmXIew8Xc4a6WVsglWTR8i\r\nAwwamwANdu0u3mRJo9D9RFUFcizCSiBJeChh2WjzunaHL4exzdFXdEaqgOM5\r\nVN60PjmlCuzsSDd+MNCOf+qxww5H1UgT8RXuyvSjET0zhQGt/3k8LGwnSheC\r\nez/DiW466GgyYgvdGOy5ZKFp1syhjVRDIMk=\r\n=1biC\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-pg_0.12.0-beta.7_1661287029828_0.12339145346030667"},"_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-pg","version":"0.12.0-beta.8","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.8","_integrity":"sha512-5YMx/0ucgbEewfOMWmMBy+scbkxUIgefXTqpyM8oxlAFd9jXW9M0epG24INCn8eeOLSNSbDW8fr0K79WnnIVOQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-5YMx/0ucgbEewfOMWmMBy+scbkxUIgefXTqpyM8oxlAFd9jXW9M0epG24INCn8eeOLSNSbDW8fr0K79WnnIVOQ==","shasum":"22301bba03df97a2e36e1e40befdd8fc84ece31b","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.8.tgz","fileCount":121,"unpackedSize":189731,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGfX3D5/caH/MSg7sTKvCNxnuNnmR39DGIrx10A5fKODAiEAlck4Ywk0tRbuTuC1EVUThn2oNfzNT8ITmF0NDJ6p5Ps="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFfDgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrkig//WT1yXtTvLi5hpqkwZAUKKfUZ8OkzFjpkXxk4tjRD08RWiiHh\r\neAPgYFeiWDiG/nF6uLiq/frE9zw/QGxDCiawRebgaxQ2uX6t80qd+XO0Szjy\r\nyrZ1lKAS0uuRkzYV+vt7AES+UKRU3ECbI+DpjxEp9CmwyD3udAmcylo9zz0M\r\nAwrk1/7Q4tJ7rzRWqUQSB6zxFiFAsDu9Pca/yEQAAoxnAiX6u9bXPuhX0SZM\r\n1AqzJt7raqVkW1AkwwhUHIa/rj3ykKfKuAHBFk0ica4293OSE/Vd9kYPMrNW\r\nxTg7bV1daN/umKcJ1qjjufMD/uzXJ96SVMdsBIWuTH2Ufy7UGOSiwHiwMdnA\r\nmYRZjW9CwZyHAqRboCxmDGXF/FhcWorx6Ztppw6iAYdeNYE4V3Z8lwRpF7io\r\n58VKxtXIvlJ6C61w7XCHAD+JTAgkbgnEMKvdm6oUP6yJX8vTPYaunXFRyf0a\r\n2aCDUuOe+p20LInICtf2X4VeViRrbBzGj6yVkZa+/81ZlgPAFR2tGqqOhFTB\r\nYgyPdPOXxzFGC2sJgm2pbuQH+gD/+aAeQd/HzSzeE2hlUa5VBB2/IYTZmxvx\r\nGWET2i0xL6Rtt45ZwuL3HlxIyC1xFzJHpX7elW0A4g6tZJ78rNVkmsINVEvc\r\ndjVAdhWI41kEoQRDIg8PB96KhYUIt3/4Cg4=\r\n=tROh\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-pg_0.12.0-beta.8_1662382304222_0.3994161726315717"},"_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-pg","version":"0.12.0-beta.9","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.9","_integrity":"sha512-M8lPzel20wPu1jAONdANkhzPNqjCQ7wp2Nb9jwNG43h9/NI6lrXRHfNgOzGlNPYCQZsaY9mG5SklAFEjCnzDHQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-M8lPzel20wPu1jAONdANkhzPNqjCQ7wp2Nb9jwNG43h9/NI6lrXRHfNgOzGlNPYCQZsaY9mG5SklAFEjCnzDHQ==","shasum":"2690d07f0e929e947f08922bc961e09eaf06d11f","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.9.tgz","fileCount":121,"unpackedSize":189934,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDSn2fwFYTsqgTfKrk4NCw+hB6w2aYK1v32gAYAnVQn4AIgXnNdRRs+/DR5c9LY91dIyl0pglQc3wnQt5tuLvoVwQA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFgatACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo8VRAAjdtsw9fNvhnbyn5WxJ2aR0lUR6OrF1smhsLIYytDNcxc4r1n\r\nGLWjzzi2Uy0MtLEMHi8TxuvMpIA0UoF24NMtYR1J2RVv/ufZFmtlaU5VVg1V\r\nNb35AfwZ58mRrp2f0yL4JWCNYMIKsNMCwgUrSht6CIfwJJyHTCi6J5n+FFmC\r\n6G51L/ba1XJx7cUQd+p2zAPH6ix2MHpv2Wj1+WGRouN8jUbFkmwzH5ouHlVg\r\nSkKkDtHDG08VjDvm0p6w4FBsiARessNO+S1+AX/vpqZng5TRB0eAhTmoDc+U\r\nDbw0H0qP1jvDYpYAcQ7nKDavtbnaqLPhazfkVVw/tHgrE3MZoS+YULtneLDK\r\n7YLxDK59JfZAxq20uwtzhiRBsNNIrKxznVdHz+xbdGtPYty0QqIwa7EXBv+9\r\neMjW0SD3kb7LmbDXib0kcg12PEtPQ2goj9OETRuvG76fhQyoVUqOoiVfWgX7\r\nnFhCO6bVVD1XQEYAj+BB9tHF9dw41YZXnYo270hmfyqhtypw8DHZgJ/EuSAx\r\nVFu1Euzj0M2upImxOpQ/CpSS4P80Ka6jhiaYS+WQ/lcn6Rl5dTD5T4mm65by\r\nh+c4RaYwyhGopqYz42xsNbLkVhwGuwseK+M1a7Rwdp/n9C1gLOfAIAFdbzFI\r\nwVbtjnPKFA8C8PbuwG2UxgVdfEiyxx9umFc=\r\n=Go7e\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-pg_0.12.0-beta.9_1662387885762_0.6102210723989736"},"_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-pg","version":"0.12.0-beta.10","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.10","_integrity":"sha512-4YABaf21mnOMteSvGb64hgjInYaAzP+2clzQVzpReSzhS/V39ckFC3z9MT+4acN4n/BNLCmkInvmHdrdUDxpSQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-4YABaf21mnOMteSvGb64hgjInYaAzP+2clzQVzpReSzhS/V39ckFC3z9MT+4acN4n/BNLCmkInvmHdrdUDxpSQ==","shasum":"814be1a5d0d2981311546b614db66c36562d43a5","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.10.tgz","fileCount":121,"unpackedSize":189937,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCfFhMzG4laH0kGJQlwiI4JtiFUlHfNIrDVrHqML11iPQIgJ7FB7HturDfQYNLryEXR96ZDsheE6Q/nAEhGVPb7CfU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFgkXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmobRA//XuKzGrZ7X/vOhrzr3HyW0fnsJNw/HnuOYp3T60q/AtMnEBUT\r\nuLQ+BjBciCE5vhJmqmKGEPiWkNw+1366QAMt1eYpQEd2AHPNYamUUC+dM1nd\r\ng7aPK3UTk5laog82I5tKuFicVybuRY0PkHEvY1/JOBHToCgAj/hbzubOfAQu\r\nJRLif74XSlowhdatM/W8MymJFjDcZjq7WzZXSvmvuF4f3ecNcpW/J5JT7356\r\nvkfr4G0SFtZ4tC+FvO/XG8OLOg8THK7+ylyNYqiUd/CfeKdcffXDym6s3pUk\r\nZawZRbvsiceULRwpslSjcCksdErCmylXYhWSOwQR1kAxNZWRHqPmq1Z4Uho0\r\nFV9mYbsD2S/ZKThudUZxwNNxgRDHTyrWFs5OlXxLJIuhY8hfwmcVQJc05zxF\r\nuN/w6lFi7Ndhj/M5MZBFmSNMnCVLOx6GO0h9fxGvVBinxkOUOlt2LUQ6LTDD\r\nOQRhvAiwnxg/SF25LrF34OwbWIPafznViWRINPyKQbhCbGJp7olMYrBggx62\r\nV+84R7S8eiMihh0Bonq0j2XS67vn19ElDS0VHwutAMrtuGobe2q6+Ah1fzmS\r\nES8KZOfK0A9fnnrGwGhJSTVlWsdx2qeg6pM1uEDhxWAjDukDcD+BkAEmnh1V\r\nu3v/Zet7MI1uGMxSF14rBxxji/swUfT/2RA=\r\n=5AaP\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-pg_0.12.0-beta.10_1662388503154_0.4272325614673276"},"_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-pg","version":"0.12.0-beta.11","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.11","_integrity":"sha512-CdbdBH4drf/9RWjmcVOgvxZhDFQgxC3gg8iiQyKNjPxCcmlVyJPVTla5Ef+F+Cmh9ytdSU1bfHXoasWV/ap88g==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-CdbdBH4drf/9RWjmcVOgvxZhDFQgxC3gg8iiQyKNjPxCcmlVyJPVTla5Ef+F+Cmh9ytdSU1bfHXoasWV/ap88g==","shasum":"1a7db95e46e5743504ebddbda038ddfb5a33ba06","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.11.tgz","fileCount":142,"unpackedSize":209551,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDXMK/vS0B/o9s9ofsY2wtw8sQM9GPlt7IQiGKEVERP5AIhAI/cyf686x5p/9sNnXQAYP2HzBFa4nN6uQTAPl9zDm3a"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFzsaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrW5xAAgHXgRhHn7J0bjY0T6sUSNw6HZboYfSAkOEK69ShF1z4Oyajn\r\nSct7blqg1bXtErBzFiai+meac40ehJuJDnsxZu9NzoltF8rsSsApwffQeiDC\r\nCLIGSKHkMlVTPbB0uxPlKIOGwhhD2YjMF/BHwJisAVuU/UIqHmU43zbWmvIl\r\n8XVjHLDEhs7TdvgS75SJWz0JGZmOp1GwhWII8nI3ygXUpniYWbH86/A6LAYH\r\nNR6MWn2H/1DK/FVZnJrPE+2yR7yDjpFrmq92CVHLjpNl1h4OXZAfkbDSPmLP\r\nY9bY70fo7w2ebkPLkYxDpVZbLJ6WX4nBVCj7k5ERtH7ndwaAVfPCweuZtDsk\r\nIZXpUCEg84XKZ98PjvN47c5KJTxbuiQhod+Dq8OldWd6yOYkKDNGXL+ttP88\r\nddyqzIEhfCSzdCL2zvgV085JQXQDihqxujv1RY9Ut2V9QxMtRChtYRv3bZ4s\r\nWIN9LB599JpZZLrMOpanRfhmDcIXoVItmG3lQh2dpxEfoynHndehGUvGBBDQ\r\nV5wwcr2reLIXwYfcAvsBcQCQqLaa4tpiq6eSVlOVcOuPaoRfkFTKP54EyvSo\r\nKt9szkGP9v93p3Vay2gZdZnjr2H4NPyEgBZo62atllIr6m7qFPgt3Z5nQfcz\r\nIJKVw7M33yLVLO3rQ9fIFm/X385xwra8yaw=\r\n=WTGw\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-pg_0.12.0-beta.11_1662466841866_0.5849069328803627"},"_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-pg","version":"0.12.0-beta.12","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.12","_integrity":"sha512-TBvsv7b+D1uY4yiV7Ho2LpOQlVxugMkI0bSDkb7TLrxEU+DnqjTG7zwWl2QAB+u+z6GFOghY9tZR5nkRxEOOVg==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-TBvsv7b+D1uY4yiV7Ho2LpOQlVxugMkI0bSDkb7TLrxEU+DnqjTG7zwWl2QAB+u+z6GFOghY9tZR5nkRxEOOVg==","shasum":"0da8c26435dae91a333a99889df68c63e4636fbe","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.12.tgz","fileCount":142,"unpackedSize":209631,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAYykCr/0cL9aMoi9FgrNn4BkOQfAwHx0EedcAt8mje0AiEA+stVUYtQy2W/vNkUkGyO6zeZ51AkxMfT2lV3Q7g46pg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjF00kACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrlqg/9FMbZkjdTgxGl6+yH8SSxQJSr+573DfU0CX59SgdoWyjhYaBx\r\nOIgqaQnGTrP0qP8ej+z3txBqz9JMZ+3bcfjE610a0x+r8GsAj07b6HhOfdvE\r\nlhk3+begPlejZgfsVdVduDNCkkAwmAkICpAYMbwikfcnNxPLeIxRRxY5ZF4x\r\nOBYTJKbPB9Nq7z/Ib8noouMDRZHdnkpT4toYd+GCv5MwRoemkcmhQ411yzYf\r\n+dcbDLxh6b9EcnqQe1q/80XWsS3nGQ94y+y7gtKxT+bIIzXz0mvEYv9/di9P\r\ndvRCharZ1L+1JTFsJBQ2JDuBoNn1dm9FkSI9TTuVag0jI8AVOqi7uWVMn401\r\n2HSNJoQq2YJKVmikBoMZNy7xAqW8iXr1FpONd4csI4GmF8FdcSX/NqAyjtyi\r\niAeXKC551ddCFSOtkH20THCSmoLLCiwKvCDagsozWXhjZgcU7gqwCJ+B/yfa\r\nCB3Nu6g28PBOiqF+yrlQwoHIMc9yQlNiNt4jrK4zl+SlhJ5n4tG6X402zNap\r\ncvXHMXStqbFwMZu7+t5JQmKKoiwhtkTjL1gePhYBQ1r/EOmG6rSIebrxybmh\r\ntWrY5RWzKIvCVpniEV4sDdmTzs7sNC0yeLUWjAw6EUY0ePIlTs/v5mU+QwEm\r\nZBamnyLUj7C/yPbMXf8QN2Ve0brZbwG+FjM=\r\n=vuXV\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-pg_0.12.0-beta.12_1662471459993_0.47523690224796744"},"_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-pg","version":"0.12.0-beta.13","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.13","_integrity":"sha512-mOd6+/v921XSSq1lYYBfDB8Cv1NCXcQODb2274Fmk7yoU4E/L5rERbnpe//NeJmZCYJsnKJ6WNsInpR9KgiwQQ==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-mOd6+/v921XSSq1lYYBfDB8Cv1NCXcQODb2274Fmk7yoU4E/L5rERbnpe//NeJmZCYJsnKJ6WNsInpR9KgiwQQ==","shasum":"0e527ecda013ad59d84dc095d335f5214be4fd5a","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.13.tgz","fileCount":142,"unpackedSize":209585,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnR5jccgjA6kLlDxzQtuicfrWtaPbmh8gJV7J0/Yyy9AIgejfwkKnKmTirhiELzt97Cfhf45zBNtSt+QF8YN1aJG0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjF05PACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpbIw/9FtTwixQanoVnNk6Qwnv28xsE4Bk7dYYcYNsxPUrWtPaB2zra\r\nO6BHQtes7q9dnV+rPIbpvu1pj+egCJNJXAaoMz6s1UPOpR9y4PT74Eu64C99\r\nfIlo2jfCpQEX5Nl33lgWcz/EzTsHM8dVxfHXNbPz1AELRihgPKRR5cIdUtbP\r\n9YBzE7NgUUrCRGT/B1vpiY8wV2GuBUpSxkdTIEOM7X6LtCExSTXeVtIZehmf\r\nWxckmDkRHzV1zYtMCjDlM9v7uMvk8aCgUr4Ee1lRbjWWujaclhUGlBGqSlr8\r\nN/8IVedrz0sC4mGTQ/CfOXb1UHqeiO60kS6Qw6pmnrI6lsCbo9a5aeD5aLx+\r\n7/pjGUcK2W3TVA2YZOO8ZXZNeZseNp/A4D9GIBUBnCL5YxlGSljOIKJJPyIi\r\nBEGRP2yxuomTrySyJZsv+Kk/moI00y7Bv3qLqiN5CUmw8TJs1fKvyc/gODIs\r\nwO/VoLeTaXVnvHhH4HTBTdiaSPV4dMEZzvCe8UgvB9qkggWYr6WA9Fq6yK8y\r\nQNA2UZ4xsLysjzfH0aWhDJ+or/JHcZo0QPATCe4jiYQMbGgyjdUMN7srkGw8\r\n5+DXNW9ltrHHmuyyhD+0I2wMYJORQCfiwVocETyXBF39Aj1ByWSlyIYU8q1L\r\nBQ7b40frwjmYKLTIMIIyRGe2h+cXAXY9MLA=\r\n=5MDI\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-pg_0.12.0-beta.13_1662471759348_0.46293652467772906"},"_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-pg","version":"0.12.0-beta.14","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.14","_integrity":"sha512-9B7VbIQ2e1UHBHBpe5TYpPV702qrcOZcOCTLXYxFKP15mu8jIIG6Z6qetkKrAgitp83okgFz6oxXnkV20DDSeA==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-9B7VbIQ2e1UHBHBpe5TYpPV702qrcOZcOCTLXYxFKP15mu8jIIG6Z6qetkKrAgitp83okgFz6oxXnkV20DDSeA==","shasum":"4aa45407a5e1fdf1fa78b7481f84665a00b7f31d","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.14.tgz","fileCount":124,"unpackedSize":190893,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGvNN+1iHmVyUxHvmd6UQ9F8gpqvCZ0G8to/f8mKFV69AiEA7BTdrGm3hxlXN5k7w17f8a+HrF0myU4McSHIVG8+lIs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjGe0FACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoXvQ/+PCW51jtwyFOEqkClQD9Y38o/4EGXQZ6IdEUd9bVrdGdWzxii\r\ntJ28B//P+JQbezeCGeKuzm1lR0XkK0KI6Wr+gkZC9i3T2HBIa/bS9WyxgW42\r\nt52tURHEqMDC5glO1DGm7zypoMBNiVqz43e1axOrTZ65cc/PHoML7w/3jNcv\r\nlNAB4cgSWdoJvPXLv7Gh7t0b0rKWqxjkJLBJ7dx3bC2XdzcDWATnENUZuooc\r\n8yMBnonVyGBoJyedWXPjq0q0A9Tx8med+gqu7eWNAwg0MTLdK0IhRvxWMGgO\r\n8D4iWXskIcm9ZASspZEnzdL/oICa9im+4uHe7irOEscuhFIC2OAiLM/rNKOB\r\njb0DIjd5sekwncc4717ZWg5n9LldSiEC+C1PsnvX8+X6+xNHrV85yyW2hNWz\r\npnQHrmGldQ7CeHOezqWCKYZikXbdyJVFc26F1+gvsZ32Gkdd+4ppzjRKYXz1\r\nWcpUvgpqsPT9ucwmMZ0b7LHSz9RIbbiBRuLH3i/DG/+K6dr3lLYkSV+r40lN\r\nRfCI0qDbD7KisCMGRJvmmR/scrB9i2NMKglWD7/dIW9iTzKlyK8oFIN9BnhK\r\nQqTSZ7amdpAROp1QnEeVPWgm77abHv8DeHJSXWlzdIN0lWsoZDgOb58MS8i9\r\nWCCVrmttr5x5R94K3yGL1ifywjQ/ZMzq9ZE=\r\n=taSV\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-pg_0.12.0-beta.14_1662643460861_0.7617475588490061"},"_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-pg","version":"0.12.0-beta.15","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.15","_integrity":"sha512-n9Yz03Ouw1CR2+aaM5mL1HiFJJTe8MP3vgVWC1GYINa4HJyXsrpkPtWOe/s4jyfMi3vaQHnox9OyhTisxHPS+Q==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-n9Yz03Ouw1CR2+aaM5mL1HiFJJTe8MP3vgVWC1GYINa4HJyXsrpkPtWOe/s4jyfMi3vaQHnox9OyhTisxHPS+Q==","shasum":"4b1b8a10376d1e4c6e4f97ec60549f6d2c7f2d33","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.15.tgz","fileCount":125,"unpackedSize":202952,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDxVW1s0HrqQG4W/kh+bfNAcYd1vi9NDxKk/4579+2CIwIgLQXI0DA4Sw5YMTFY4KdUAIkMtrABktrBZNK9h/WNr/w="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjGe3SACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrgBg/+JUFwf8zIcFFOBVSTlsHyGG7F0B3AnUZBNWEfPQqrSVZem6cT\r\nKAJLJbYc1KDHcuM/yz16jVWy1FTY8OMMzdOaV1pGuaoeXontBxk8l3VPrD4U\r\nVK068lPpTHKTK0YltlJ/p2abLLZ3lZnP0iRdDSjdURzjI4tp0KKNdiESBiyG\r\nJJmT0EMtF+G7/yewPntcCyMh5qpHHg/wc2JzsKdkChKup7aEMmzr+SN4VKbH\r\nldUANuinV4OwNfuGvbdNghv6S/wXPuCPtAcW+I9BhW4PfccnLDgek4N8/gU9\r\nMKr9CQlI3E4GnFTCB+FDPJfO6Ga3nf5yYAJ87nDC7Gmlicaom0LCb5IiltsA\r\no2fFJT8WFceCOTD/8potL44qu16uX8hS38PJAAYBaZvFvtWKjuTGZb4YTcY0\r\nPo/NaVUMYQ/L9Kv4FoQRr8smGSqcAfpYNlzyfHZJilekChqR1Srjdcvxyf8Z\r\nTfa4nANhF2+5j4zqkrFg08bxneVzB6ndBLUdZNo7+60gDVhnSkPizzlNjVCu\r\nM8HW1CBKKijuS1ZQD9XxDJZV+KOxwxfRVpSmoyYRjS1TADejbOE6MmpGyuAL\r\n4UJ55UFuu32yOVmvcl/+k7VvJ3xpOdkAFz2HMJA+JdpP7hGWW2vE5ZdGYvVZ\r\nGGHcrjplNEZTEZTeD7M2QYfW/hQsXBlGOQU=\r\n=jflD\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-pg_0.12.0-beta.15_1662643666448_0.3596580050786906"},"_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-pg","version":"0.12.0-beta.16","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.16","_integrity":"sha512-V6J1Ia4gZYZ9bONQtI9el45rHX1j/9RMCmx3My6oV/Fz1U/0UMpsFWX8z3ztbxB6CES/e5xKjqMYN9QP+eL8Nw==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-V6J1Ia4gZYZ9bONQtI9el45rHX1j/9RMCmx3My6oV/Fz1U/0UMpsFWX8z3ztbxB6CES/e5xKjqMYN9QP+eL8Nw==","shasum":"d38d48310c2d92d7a69596ace873a9e8a09f063a","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.16.tgz","fileCount":125,"unpackedSize":203423,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD2guJO6xmw6OtyjKVszuwib2xSbELcvEu1afhgCofBsQIgczmcUhD4q0xr1KN02SF2XJmUbVEk/lBej3WYKjnNfpQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjHeuhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp5Xg//YlVeyrNNOQXMaWWwGT3wPcrkDm/vSeNV6yVhuyF0LRDuMyHV\r\npluT9k7x4CbTzezSjkZG89zjQODvQDA3JZWo0NfN9h7eDv6HfnfY6Wi48XL3\r\nBJHpo2GvT9V1EnOSX4fjKhg5TOvzHXczZVG8PQr9K5Qm/7eeatfUOZG4XDFZ\r\nSnhFYimJoK6CWHuVJ3s017+OvHtSrwKoLhzib3tDFb498g1cNapnTiR03JQp\r\n9y3RxJvOyr1iau7bCMAKynTPrNfOYSL72g0DJsMkVrLWqqfq1RhQPo1JxCQA\r\nDcQfFDstxSDh9mzEU+eYNftWByOmzjm+kQ7J4e8VC2D3OlnGH1/PgyjraPyo\r\nuIiGHHg+RrbBsBtr4T+oA0NiR7lfccdAnTWaFNbj90ElXphqxqwZRueRpwwR\r\nGSTEPpmQDIz5odYrWpv7FJj6jNUdgbqfo7MtK/Vs2WYSenoKXSTp6VOnBRIL\r\navYVyyFkz67/i/XpWZpat4Dh18HAXpXmdT4cO8cUTyVtqH1FQQKMQgYAIKmd\r\nzS1zOOmZJ1pODLCLwxt3pl5Jz1cn2iSrMWsZcqW/ppgDuE2gTe+xscQFSBVc\r\n1lC7g+1aSULuCewmhBWwAdAxzm8H5LqC5bLzatSpOxzyqzrG9RRYN+YJt/r2\r\nlF6d3WZLD533zyiKQqElD5cxygAS4zLwh+M=\r\n=nriA\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-pg_0.12.0-beta.16_1662905249250_0.34715035756651846"},"_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-pg","version":"0.12.0-beta.17","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.17","_integrity":"sha512-k/w3dpn1FDwcLL3xQTbRd04ramNR9cEC3fNPVlLsmyTVtxRyOis8Uz5anwfWddzUUJQgB8hKgiQQEw6H7zhHCQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-k/w3dpn1FDwcLL3xQTbRd04ramNR9cEC3fNPVlLsmyTVtxRyOis8Uz5anwfWddzUUJQgB8hKgiQQEw6H7zhHCQ==","shasum":"c004d674a370c662b0377126e98aefc02bb79dea","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.17.tgz","fileCount":125,"unpackedSize":203528,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDcX73RA+VeZhD0PZvfp3OFkxWQxDylxa72hcPPPKt1aQIgNlsCJ+J6fhr3Q9bf65bCt9/PARJfKwiRQwV9NwSM5Tg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjHfBrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrtbBAAkZJblujz8gylPpc2ypuXZhgz2Z8wbaGBfs3MQgp87VNC0o5+\r\nLr4PirQc/q5b/+CmZaCI+EAvB76xPT0jfcZ+37sV9F9MuWj7Pr7himkMeMgC\r\nCMGeMeUmIJPzy6Wo5REtIY0szSXHM0m903/OQD5+4frrP7Sxxa3ZHIaoxFtV\r\n0Lp3cFh4IyQdA68kU7jJN2cxbtMUTbXPo5qbDARmczt7MV76fzscob+QdGU3\r\ngZFNRb9PDq4lupcjHQ7RXEu6tMP/iU6p2E7gXM6GpeJEWwFJ1OEcyoor6BLE\r\nywZr44bUr1ER70hDzodynggCdZTn3biTv8GS98Ls+vgccZTgWWbfj1sNb88C\r\n31BYi6FWMd0zxIbLn0Tj2UgOBru7ozmnBkws5zTeR/pRtB1/GYlvXKQSIrXd\r\nW3WYTvmC/VickPjehEJfW9jExKvLRSWy/at0KTQ9QVX4CVX0xyec1nSYqqVu\r\nkKMnSkEFJiarlUIvSyLdU/AvWVlCj6h0mx1IOvlCumPl3wzLzmlJadsEfmc/\r\nfq0MAE+T3TyOW/nlbeaDtO/Nq4fjU0A1w62bEnSgN7Q15zjsvhsFvdioDgMt\r\n3ryudayjVFdsRMZjYUJn3gxAcalL1YdQpJToUHZev7Mkl+XLXx6fefPoQfpW\r\nFGsT0aQToNm3dxhY/NUUJcQ8n1Nr3/itBNg=\r\n=OL2f\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-pg_0.12.0-beta.17_1662906475597_0.5335105507713993"},"_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-pg","version":"0.12.0-beta.18","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 version prerelease && pnpm build && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.18","_integrity":"sha512-WpyTrbIxg+DLEzg2eqsQUIP/ndDQK2ssrQCPRWnhH4vGErKt8OtbFK93QoQsfaneDgaaWoQMKHwc8yddgdBu9Q==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-WpyTrbIxg+DLEzg2eqsQUIP/ndDQK2ssrQCPRWnhH4vGErKt8OtbFK93QoQsfaneDgaaWoQMKHwc8yddgdBu9Q==","shasum":"3d6bb1c6e45fa54346987bc6236f7850821d3389","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.18.tgz","fileCount":125,"unpackedSize":202875,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICrYVsmo2umHJdcFjC+rOyX5qDWJRogsQuShunTW+AoIAiAlIdV5wgEsl2/ak8QFhB320Xxx8v4JzstImaaKFdzdYQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIGmqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq/AQ/9ErhJJfUmE+6L541vy+7iTCaPzExaoa5Ge3aILTHiho+tQtOE\r\nURAVPJfnXHi3WAKEeKKm0VSIvW5zF0EZoskMu1OarfIEiFc3lySVG73B0P60\r\nJUMk8MN+tLNcWTnPeMkM9FjDRMhrOuS7RNJDxuxcMq/FePRLQ4AIJy0zDdgH\r\nFXKlu7latXiIDctDW/ABJAwYrKmqIn/mwHl8yxwcD/HVc72zDi0f23hOdPr4\r\nICY3pR4XLmfTMFjsRAS9qaUW3Ow2xd8OZCacbnha6Gb4BVqdd8THqu1S/6Kl\r\nDqJOwU9HFcdYE3G9NHa4ooSP4Hp//RBmxG8ALCa4PRTEpOTPPFvsVvVunSEd\r\nUtNDuA4cYinxZkhHGLv8rADfKlS5XQvbdLAowmaI+G+ah8pYWMD0/hBYmUW6\r\nH9DhGXjDEpHgytpQ8m/KTmAx2yHkx7mnx4xKUeyllk81DPgHB3pkD15HDehC\r\nnyw36Ycjj8CLu7Cr13nG9/k1iZWox4hR5XidznrvvmjFPK5P1VPKwDhNzhK0\r\n9emLDcNuMCjWsE1X2yMDtfJslUx5Rs3DFmCekzvJWidG27WhnJOr4ODCXp1/\r\nLn69xTLPwckCstUDPUNfjRjRJUMZvHyomD0K6Ax+uBiwBvCbLQQCaOdGFBlg\r\nGHmZjO4MzH47zTwTVU+TkGMKYAKAVM8lfpg=\r\n=ImIg\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-pg_0.12.0-beta.18_1663068585914_0.6646688159078589"},"_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-pg","version":"0.12.0-beta.19","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 version prerelease && pnpm build && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.19","_integrity":"sha512-cJJwnA+N3rVFynZTT/UWSyaAQF/zNdx1OL2itpfvBBiIRNrNqkWVWURUWqNhwEAaQrnHaVVQgaEEfCpOjKoS4w==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-cJJwnA+N3rVFynZTT/UWSyaAQF/zNdx1OL2itpfvBBiIRNrNqkWVWURUWqNhwEAaQrnHaVVQgaEEfCpOjKoS4w==","shasum":"f8e6e1f8dda36b856040fad31658ba8f4eb0f508","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.19.tgz","fileCount":125,"unpackedSize":202976,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB8FNWCkAUXwDn5uAlnkmKxLO9m4l6fDYNl+2uyaAMZhAiEA9Qi+Z4Kwv3BFCMhWLDVPlFS2d82EXz/JhjQTyh1chY0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIHEQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2IA/9HTl06U0mgYQnSGpX9zY2aKA8KUG8m/lzdutTm7RiXZlzy1nt\r\nmmQycGaYvIcyIEcuqd97ls5BMYxCi/D6SOdX0ZMSRVPxt/5cFlgdPc7LDIUY\r\nrCj+0SylvEfEl5zc+WmZJiATvk4sovX/TtwF6RIuHb0CTBuM+QIXihI2LmAO\r\n0XeaEhEvcWGC+PSGv8DZ34N8yojRcyz6vOtH1ywnNKwcbZ/Gm4CYvxdC+nuv\r\n6JlvCleCa2NDPMoAsy/4WXMM7WaArJKS3bYk7vjnnuYluUWLAlxmUg236sxx\r\no5qNe2h0ce2/3qnLTquSt4pgrCEVdXfWRjKfvxJ2SHSoYnJ+OW4BqmQsTxNE\r\nyuzwBivYDvNG1/vb5BMOnF1ROvmFKC1Au15eH7OTPHgnq4MFYHZQSond34yw\r\nhGemAxkTHKugS2j6f7rYWDP++ipI8621emHvQPVGcrnzax3vO8wBL2VU/hgJ\r\n//TK+dlXaEd2InNUJ15WNOlOmDY46u022y1zPLZBtTaITT2t88Ds/I4UJVkT\r\nywD1Uz3Se07V/Wp/2NZX7zilzXItt8I1LQ1+7xvCoR5CGu5saFjFD/V689Uz\r\nYz1KT/+CVsK1AdHt379eudkMUVRLXY5a3f6pNpzkdOspscUjIU5FWrCyzAYp\r\nUgNWH2jnNzfD0TQb8ktZ8ocBKYrkVd2vcsY=\r\n=fnk2\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-pg_0.12.0-beta.19_1663070480394_0.06330633827547505"},"_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-pg","version":"0.12.0-beta.20","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 version prerelease && pnpm build && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.20","_integrity":"sha512-mANsq6uYPBaZVzWWYglue4NwNxeuhiWGoOd1p/qy5/Pcdx4VNyvCrmbFnIJbKija7DroyADIzUTagSpy1UGHSQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-mANsq6uYPBaZVzWWYglue4NwNxeuhiWGoOd1p/qy5/Pcdx4VNyvCrmbFnIJbKija7DroyADIzUTagSpy1UGHSQ==","shasum":"93f6f48cf6237cd379017104c3acfb632c88124f","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.20.tgz","fileCount":125,"unpackedSize":204037,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH/IkFV8X5BWQs+FGAUj+314TXjPRPP9KevDQXH2Seu+AiBRl1u7OZpgIpA2vxHR5KJPVrBWSmlVjqUG/nLu1zM/uQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIZRsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpDJQ//TsxAjNdUauLrzOSF8sLt+opKMR00BbRta/z8OMgGTTGLmkwQ\r\nhvzikNhcbXQkdFuwYmQGgTxmuhWwrmBfqZISTbDUCCwjAZHFN3OoKiskNi6p\r\nt8tMyXuk5czAalxQFg7kL4qQ5S4tVStu3tuWDFyLapoTvd1i3rd2mdfT5hc0\r\nVTNgOEvCAmJhUL2rgWJ0IRkodsSTQt0ZWVJf5vow3I/Ci8a9BuK/a3B9mW80\r\nvXK6v8plGjuFGkhka+bavHeQ84EJbLE1CBIhLnRobiNQPz93qx4Iww4MJgaR\r\nnhZnJJedOeZ37pumpEDlGiGgqKD00K/gUGShIe0A13zf+3qwXwJgi0hlCh7S\r\n8TXxhN1nGTkIsAYsVWb0wQIbEI6cVyWXrcR7KiSqH3cK02ANGd75qj4DEXiD\r\nS1uGG2eHontl4myyIwPVRRE8H5O3uURxsq0bRQvT0XxTufWUAKGHadpEAxhH\r\nIVDXG+HjdZ8u2SPVjkZ7AL0VVcWQUhZeTr4t9xeINzj2mm0rtHMdkBc8v8Er\r\nw9P6IdItUxJ6f0oTCeJ6cyRJ8GnOZpSxWJE3GLRPPc1gtQ7Dej63zX6Cr+Pj\r\nk5CJgVWcYMXo9g+ErnJMS83ESo9YI6wb8FoV4W3NBjRp1HsVVXnbCfxB+0lj\r\npH7sv/UeE7oRzAmyx/VsuGLMylt6FqCcWnY=\r\n=V1Uy\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-pg_0.12.0-beta.20_1663145067791_0.5138591415212896"},"_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.22":{"name":"drizzle-orm-pg","version":"0.12.0-beta.22","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 version prerelease && pnpm build && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.22","_integrity":"sha512-mHwwMRVNlR/lImPbeh5q7lZodrTHXiZV2TVEv/9hUWgnd8beXWdP85an8KZXiQAlU14vM5+mEw1DoRmCbUx3FQ==","_resolved":"/home/dan/dev/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"18.9.1","_npmVersion":"8.19.1","dist":{"integrity":"sha512-mHwwMRVNlR/lImPbeh5q7lZodrTHXiZV2TVEv/9hUWgnd8beXWdP85an8KZXiQAlU14vM5+mEw1DoRmCbUx3FQ==","shasum":"44462dd09d3c2eb6476460aa214a9108f54ee50c","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.22.tgz","fileCount":128,"unpackedSize":206789,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCF7CeCd6XrG2deEZOT94UW8bzrpULGblVBsuNKH+APOwIgJ8ayCmVs3wpPXV1isLhcGGWO70ucOL6GttrQdi5u5D8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjMDejACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpx6Q//a33sPO+JWxN89LLh1IouMmjAm1TlpSkJ88y1hQlsB9Sv9DXd\r\nhnrL3k8ozHXZ5Xc6Ab3Xjjupvu5mvnsSFER5yeBSMLYNqikBxK0WNhAygcbb\r\n6P2hnebRsa31/4WGz+CyXu2UMS7nmwgbjt7cfttsIYprLL8Ty1qVSMtr5a8D\r\nenf/FUJAPgdZ61vwKR9HIbg5JRoTxjTXNTtqixApKfCs6JP5ekfEyXJBr4VA\r\nrTUNI1nPM+MeDfygp8eoErXU0e+YsscqMlxn44aUfd5jbZsuxi9Eumlf0R8x\r\nGyEPJR4xBBuIQCqTPdPSc1yHfOyzCio0z6IIMhTsnMSQndrEPWN/bTYYScYw\r\nq6etDsoUCfhJygXbzipuKI7utZM16WwP2FU4UZwYIO9L46U8yf4m6/Lvp5wr\r\n20jFo8uH/aHhfwBzTjNHpkq0im60erqtmmKl+wLexI4izdhIDSSF0iFqeX4O\r\nnfeEQ+v/vV67QdR7gepKQt4iOdD4QuMw5P3z7ehfnSY/+9MNhGLuvDtng+si\r\n+mTekvJfiCMqB0jRs+FQ6POkbHps984U8Bw3zy1u1HOBcO0rXqwhKbvkMMmz\r\n6D0hISDhTYkXYDapWRFwlxGyPzyiAv+mp2YoSc6D6WWNScEW6mk+qs5MHMRY\r\nNksdOO4m9b4mC2+fYRjgxvE/1Ws/Kq/HgNs=\r\n=LY7W\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-pg_0.12.0-beta.22_1664104355170_0.5677954036404538"},"_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.24":{"name":"drizzle-orm-pg","version":"0.12.0-beta.24","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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 version prerelease && pnpm build && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-pg@0.12.0-beta.24","_integrity":"sha512-K/cUQQmMkdcb6yILfxY/Qo1ymeohsSIvtY70L/hS8WBO00JEAVRoVY6eKrjCUymAOkCGHiT+DTGP4BRqPpIL+w==","_resolved":"/home/dan/dev/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"18.9.1","_npmVersion":"8.19.1","dist":{"integrity":"sha512-K/cUQQmMkdcb6yILfxY/Qo1ymeohsSIvtY70L/hS8WBO00JEAVRoVY6eKrjCUymAOkCGHiT+DTGP4BRqPpIL+w==","shasum":"ab5d8fb4235e3ad716270bcd97445d42e7452c99","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.24.tgz","fileCount":128,"unpackedSize":206791,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB6O5mgAeg/oG8kSYUHce45Iu3vCNU7Mm3j4tgAcdtf2AiEAt4abJn1KE9sWxGgGNXQYRlae4UWlSt0emipbhkISpwA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjND8JACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2ag/8Dmu8d/ZdljxzY3GEP2FZ64yp6Wgf1ttygxIyTo/Ocnx5u+H3\r\nmAvTjhirRaalsT3U85NjfnrJEpV+1d5UJ481rG5n3eS9FT3/VO3ionprcKB8\r\n3AeSX+7Gy1URpqANViq4j7TQeYXZ5dQwjzaVZ40svM8ZtafgHbJc2760NFDE\r\nU/Dtdc7fcPbyQrVqxHX/RPDSky+FZhFN5b5c6lLyqgwd4C+4pq0vcHRuL586\r\nLNCu4dPw3BL2y1Gz5WDPEb50lfl6MXJEFm3nIMqnp7abN4iXpQRISSIs6G+T\r\nmsnVcgGmxzUxwZ/+xZbjWTNmaWatG2TZLqf5I5fTyJtBePwS859M4xumRSf2\r\noIwafa4xjwfms0rXvOY6dWDzioJsnG3xvjxUvs3IJLMhQuhOAxy9HdTA29ua\r\nQz81KECgnh5yYf8GxJAEa1lweeKSwkrnBhvsZd1cepHN5a66RFwPa/qsjlcJ\r\npbhqSg7XYUc8TjRQQr+PS3oWbddm0/BcYMuJcxwRJDTEXWQx0yvfhleKk349\r\nkMQb6VvjJh74nvWXhhIlj4e35k++w2EE8j8Znayxskar5IzV1d5e0aWhlz+3\r\n1PIQDTd3Ge0Mv758hju6eJTOnchQLNRpIPleFdhknd7/nZnJQB5p/utp51cs\r\n+fQXdj1+Fn7xokj/KscNLLlynuPB+GkAyJ0=\r\n=A8M7\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-pg_0.12.0-beta.24_1664368393031_0.09656626735942209"},"_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.25":{"name":"drizzle-orm-pg","version":"0.12.0-beta.25","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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-pg@0.12.0-beta.25","_integrity":"sha512-62ga1HAobJdnk3E3bfQ9l1rwiVNgDXQZ1rFEUVsr3CVddDlRUdeFwwXOM4v9eXmRA9XqsnUMFFn9hYjYndLAYg==","_resolved":"/home/dan/dev/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"18.9.1","_npmVersion":"8.19.1","dist":{"integrity":"sha512-62ga1HAobJdnk3E3bfQ9l1rwiVNgDXQZ1rFEUVsr3CVddDlRUdeFwwXOM4v9eXmRA9XqsnUMFFn9hYjYndLAYg==","shasum":"2d04e2e1b85f78c171273c1e974cb775d14fed6a","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.25.tgz","fileCount":128,"unpackedSize":206791,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCNqttQOoUM2bIST5fq9B98i1PfCpOgljoSaCZZHm6QggIgO7vgZJvw9VRDk1EKVkLhAIF8+/mKxnVgoZhORpkAI/o="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjNFaNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoQ/RAAhNU7znGnOKtxqRS1wOv4AxN0OUL2C2NFcq3Ax6rf9bV9b4cL\r\nlfaJJShRFyGG9GkOavpPDoq/tB/g3l/ukS32HTmubTaxUStP0Sqm3W2TfS92\r\nR9Jxm7Log9s2EN+cjLkIyuW6zoQAu42+jGAKsO/BdvL9upYHjoON4+CGIjJB\r\nXPYk6uUXBXoADg39DssxseDyX/XROchQ7pdJT5SlAu1VVC1Xcz1Jvnw6ujRY\r\nToBE+i9XbJ2QGmL2X+qi5IhMqbnCAB4HYg0C6sB4eYHd7MxAgzMSLUSlhoBs\r\nFYQLhmPWGKHKwzfbl68ZLaWDsSwg1TYGaWrBG/XP2lSIHRVCmuVdn1l94KxW\r\nqzVfdN+aN39kMEBit2P4Rfl1PzQByGPISQxaZX1fK/BCFjYax6kC2laMME3q\r\nW1kVl2bke0AuqPL5jpwzrif2aylvKwP7vHPctfdgHQLccCzOfIMZGLB/xmPZ\r\nRtScz30YHDZm1UCzilj2q9p2sfp0PZfTVEvOueXhpqHZEp6pWB7ElDhfy6jQ\r\npcIsrF5woyJIt52EWPOS+c2aXD1lAzd4UyLdnsHeNAGPkDyoRuQoY/xshzgH\r\nZLbSNBGv01F6XMxqWOWOebh0FvStTpzyLHtYFD0oknf/3fbADZo5WFKOkSbb\r\nzYCcLosDFDMZ/4ptUjb6eUz1TRnpiIrMrR0=\r\n=2ccH\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-pg_0.12.0-beta.25_1664374413119_0.24048964711055842"},"_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.26":{"name":"drizzle-orm-pg","version":"0.12.0-beta.26","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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-pg@0.12.0-beta.26","_integrity":"sha512-fZgQC4xhfSxmx0FfXNe3GiPa7TROzMxMdlsk/LMeZZciamHHXxuXT6CdhlE033BcZFunOPdNPeF7RZBOsNq/2w==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-fZgQC4xhfSxmx0FfXNe3GiPa7TROzMxMdlsk/LMeZZciamHHXxuXT6CdhlE033BcZFunOPdNPeF7RZBOsNq/2w==","shasum":"950422873a2ec05434e46dd77f5ae8031e04aefb","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.26.tgz","fileCount":137,"unpackedSize":196470,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEp/nXssxnrLPJo2Ram4C3Z5e2JnD9c8iJCsTp+20MbtAiAbS+DDUIVuGVYhSc8jrlZE/mz7wKytRM7z1bVdX4FI+w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjUTZ6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmokDg//UQnKpla7VuV2sB1q8t3g51GogLXmMdvAVr0cC9o1QBa5afQq\r\nPvUTzhIifCo1FMfDd2D4zgOM9udlid8NphVtQzIJIHH+PR2JonGqkEni9DCk\r\nY+4Y0YYWw/CRczFoqumn2+IeKmt+yKHC+ZXx1Zz25b4Ot+4VXB1o4NaQkaCQ\r\ndc19D0MI5NaZ7QrFlKQ/mcca4Eq2W9x8Qj+/8ttcWZeEJYBu3jImicQSz7Zs\r\nPpUBjxFvYYse/j+q3TMKCA5kWllfZEWXZtWH/0MCrqYbd6CS4PsVlZ4Jcc4M\r\n4xygtbMni/yzLXbsCPsI87RtQCNJbRlpnrmUtTnwJnUgZEg/K1nj6Ib62+Nv\r\nqBp4XCw0ABx+47h1Be8am2pIYFOoTeGokIE23CehpCgVNYya8nQh5LJFxwqu\r\nxVdmdgSBZcPUPtiftrk45oGv1kGmnP2HnsfV8IaeKAi8zjtn2tjC0rFoxtKm\r\ngPzCAfIDyDPyCl1+gxVUU99/PByHXHzzM/FDCRO8WNOiJc1PgSyu1bcLLUke\r\nFRkB+M4mKbAq7/Kw6HYV+rBQoBYOZ1kTgOopFC/A9qJ2ytCNEI6Qn0BQF+kR\r\nm5lp08zap0wdYqX2QDy8D38STGK40kHdo1mQKayCTqQ4kDdfCVp5nv/0QNVQ\r\nk3OAi2746QSHrYMrBGjLt1aPH0VCihI0Gc4=\r\n=0hnc\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-pg_0.12.0-beta.26_1666266746535_0.6945739471024763"},"_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.27":{"name":"drizzle-orm-pg","version":"0.12.0-beta.27","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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-pg@0.12.0-beta.27","_integrity":"sha512-LRj6z5H8zdSv6ZhXms8eA5aUZHg5gJzkl+8ohlB/KOFqOsKOkGVmwS58nVCuvtVUyaV8n5b3lWk7PtmC5HQc1Q==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-LRj6z5H8zdSv6ZhXms8eA5aUZHg5gJzkl+8ohlB/KOFqOsKOkGVmwS58nVCuvtVUyaV8n5b3lWk7PtmC5HQc1Q==","shasum":"aec7e70007b8dc1ebddf25b4282dc2b798673896","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.27.tgz","fileCount":137,"unpackedSize":196551,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID8E+xIAO78psuW0WME+x7C620E2bYpperbF7YKvwKvAAiEAmlbxs9V9+DDGXHKYe1z+xam+YXteasUJ1B9emx6hkyY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjUUWWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrUNA/7BvQt5ss8So0XOFgPfG0pZYZ2pktHy+42K1VOF5kEGwvpHWRA\r\nLQ74cdl9yiP7DIsScX6mPGHJChnE182ZGTH4nctn+i948qqHRKpmskQ5euER\r\nacltGsqgq2kBHhh0fuquAHSrE++1Jzv05V03hq4PUVzaV1fzEaqgTDsfX9Q6\r\nMl6zNLue5E2hYG1zavWjXuoe0I5grDwbud4mZB7mLcKILL+vtTuWb9euPzg1\r\nij4V42KnFVP1EkVLXf7jlox1Vi9MsLKlFD+bn83HkTfeTidEEu/Q5usXpr6E\r\nM/g4mrGlY7E77ne6az9gvrIxIshocE9/sRRgsAlhRL31b2C/4JNvFnlIWfM/\r\n1QeWEgsmwyuwJvr8/WrJVdrIY/RbevlKwOkUgx/XqC4rnxiWercSC9/WOAbp\r\n3ZKXjf+RvG841SonJSbi1HFrAWXn0M6a2JrnUr8vVwQt9WuGX5agu02/xdKo\r\n4klQHPjXfb4wvpfGSbzb1A5Qbxmg1GDLC9nhMxJQC0sXCgIm43JIlOBYab59\r\nvArymXVDI7C6L9yrBSR7osVosVvoyJkpVN1M8wdYSggi9Rvfm9DlCp3Ihwpc\r\no8UhLrocJSHmNjpnJK8BSidO3OL/788y/ZqRAzvcoYAFKhvxRx5e16bnPk73\r\n70Omwv0OryCqkBdiH9n3EU4eF29CXH7d0ck=\r\n=+ZG2\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-pg_0.12.0-beta.27_1666270613917_0.864163513914654"},"_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.28":{"name":"drizzle-orm-pg","version":"0.12.0-beta.28","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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-pg@0.12.0-beta.28","_integrity":"sha512-busQQ3Ivi0li39LmuGcIwZYh6MfMraieoANIcUEcaxz5tZmvyw7oPTgBH4N/MH0tq3dYJbj8IP6HW9cFXRwhUA==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-busQQ3Ivi0li39LmuGcIwZYh6MfMraieoANIcUEcaxz5tZmvyw7oPTgBH4N/MH0tq3dYJbj8IP6HW9cFXRwhUA==","shasum":"4caf0a05f8e82e18748ed1eea9342584ec291229","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.28.tgz","fileCount":137,"unpackedSize":196785,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDq1ftisTjaSCZyISDTpAVEC15wX6hSSk3H7JGKmXAz+AIgFo4LeYPcDz15IKcddhTgIVE/XJUJhWfsl4j+CqA0Ck4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjUUigACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrPUA/+MzD7DRFpWJiVPvGpsMWoZk/d7fYxtXWGe4becRXfprDPkkM0\r\nXBWuBgxKKo5G2gF98PicU/UBYi864mDywSfLHxKrvdMn0sEV/7IbxF/gXbf4\r\n7XA4V+ddQsJqtLcbboo3n/t8mO3ru00YYN/2xE/iMYaz2DdhxXqurtqRgTZm\r\nMhhPJGzPxPtGbm0hLZG/vgVCEdH/yxBkxFVuRoSBqG6lCGtcSkr90Td9LovD\r\ngk2Dd7BxYDP32VQ2F1B5W7CisPtJK5wmOI3gTZTFsMAyz7ACgYIB+pokzY0x\r\nx2Bmb9hopGEvPEVIpYU/sr7tJJnXg6XCjhsx0NaHApHD8GSkj5Et0mWcG1GQ\r\n2XAktI63gzuXEj9wSHhlNqc6lJMgeY4KrpJhisK7MzLAusF1KD0595gS7SR+\r\n5/wvIn1V8W6ug/oxhTDrdvOFhadmGnoFrOCuDPDj7tbgO6CW6alMhtaPelMH\r\nulzAR5MvbAXZ2PgvxDxb4JFOgEvSsCDAHNcK/N7+QC/ozInUdHSSpjzFfgwk\r\n409z8TegG6E9lLsv7aebJeboaBQPN6R1XnZebVK5rq76uXhK3Yp06dQx3oV0\r\n/a+5q+yymR3zAwRsBXqz5pzjeOsEDbR/FjsaxQz61loQfTML1crwZAiBqZBx\r\nwsmH3jpZ6TFWSiQ9kBj+YZ2BORVtwFSWdDs=\r\n=1DA9\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-pg_0.12.0-beta.28_1666271392510_0.3482140356262622"},"_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.29":{"name":"drizzle-orm-pg","version":"0.12.0-beta.29","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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-pg@0.12.0-beta.29","_integrity":"sha512-4bu7zBbyy5fGjKG1Ept/uM/y1/NeYBhCdpPLvgwm1rcWpOiu9gwIlPN8sUgcWK38ZsfO9yiKH+S20cDkEYap6w==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-4bu7zBbyy5fGjKG1Ept/uM/y1/NeYBhCdpPLvgwm1rcWpOiu9gwIlPN8sUgcWK38ZsfO9yiKH+S20cDkEYap6w==","shasum":"79f2282b61581d044662660018e7dda104bf7dae","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.29.tgz","fileCount":137,"unpackedSize":188711,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHJG31E7/n0kajT/DLhFCIM9o8LOzaTMjjvr7DM0g5zvAiEA7L34tYa2CYOg3gD6WYXGLqSS9ZY/pT+HvvNhZQG2cPE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjX/uyACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoHYQ//bJz8TtnQAZiMVKhzRyjljAAMuk/hUyv/Kbw0Hm+H8LzQ9k4q\r\nrgCQae1w6Bl5B6+v1a7HkMAstMB06DL8dc3VOPEMh7we320W6axwiJgeRMvo\r\nuar36z49xgpI/fExuVab1E+p0DVjYbOeoTdxtoqzkz+qVLs5ljeoziDt5F0s\r\nYyQhUbncnzg10R8/QkZPfXJU4VSs15GOJj+RCW6tolznnxdlaYhAFxSXb7aC\r\nokjG35VSOQkZppBRfMeKIoIznxd0Zi6/fANCZcCyaMlV1hLv5V7JYMTW8Zk7\r\naCOQ2kpPk1fD3bfHqEPNprpH1Ggkr9/Ec6i1mfk1Sw/BgaFCqszUXwWSsHu1\r\nPWnPiyqbREqehrF2Y3iOGqxT6OzuVRVUzBvQTw4A6Ww2tNK0VZ60s0xqXauv\r\nEoIKTYwV3JJ/z2/xGmZ88y6eAGQif2RftlIDGxbx2iPPNoMoDvdD9L13SQHX\r\nxYAxnFaSkZ0vhhlZUHfLjCsIX1EKEdmgzkAxUWJwUgdPPp5FhsaazD9PKHmy\r\n+s38EVbyKhAn6TE8jV1OZV10zrsOZ4/TGd1CelxJ1RSGUs9bB2O6eFLYLG39\r\nxJJzkiCUAYwSvarb01xWH1hYDhUZMaP1b/Lv+ofaxFh6dOPAgvhGnk1f7VPi\r\nuB70OjLRDogB1H0u2fJZbCPoyp79yEzZsFw=\r\n=BpuG\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-pg_0.12.0-beta.29_1667234738510_0.286510396147281"},"_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.30":{"name":"drizzle-orm-pg","version":"0.12.0-beta.30","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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":{"drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true}},"devDependencies":{"@types/node":"*","@types/pg":"^8.6.1","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.6.0","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-pg@0.12.0-beta.30","_integrity":"sha512-kkxyyXvk7G+O2xpu739QX6AcsF0Zq9oiFurpw0bdH2kMjEgk0SpUG6VA7k2XdwdtoNZK54ZgAq98se5zo20ouw==","_resolved":"/Users/alexblokh/Development/drizzle-orm-new/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"18.9.0","_npmVersion":"8.19.1","dist":{"integrity":"sha512-kkxyyXvk7G+O2xpu739QX6AcsF0Zq9oiFurpw0bdH2kMjEgk0SpUG6VA7k2XdwdtoNZK54ZgAq98se5zo20ouw==","shasum":"5ae3933b6e641015a7dd0cdb85c717d6eb7553f4","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.30.tgz","fileCount":144,"unpackedSize":224673,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDeQNdIF46jVCHMsRWSkI0jsk89FzBcyw64qHjMc9jXDAIhAKmV9k8mP4tMWEFHeRss/M5wtaMMiLdtNvZWWw9pUEJ4"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjYWZvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmryWBAAiKtkPpr1J2Ji19VnPQRSlmT677kc1JD62mbGcFkPEUBHG6wK\r\nTALvEXDOccKXKRoFVb7jEEE3BkAz3kjY0ZYGcWGkoBadA2p/fEnmW6GxlaOS\r\nvw7a1zlRnF4oBgNnm8CrIK1yCXE0GOuGNoGlpw0QPqQu3rg/CcqM3eUybFh0\r\nNo7toms3z7ng6uk3RWZhr5qWTv9ri9gTGPhFazK5B7l1BTum3AVowJ7HXW7q\r\nFtaPZ3umSOnpqDCOPrmJJkD1rOBg01C+Vx9RRLSBjhc685LEqptAavpU3HWr\r\nZ2AiaAnwoyVnaNKN8EkiPkU3/a4okoZNV+WWyqLXwXsDKYntIdp0RQpP1Sw3\r\nMppJD9/tPV7MIJUvNrtfYrdOAMwfFsMx08QJhtR24KVe/MDS/RTvylYLsifm\r\nwh265mz5BSbqQaNdunIJh5Py82W2jV4wvpWCcTP3p6LW+dNhuiSdEIe+nXBt\r\n6TNOGXSVN76P4ZpjcvuEp0kqfHgCnHbJcsjuHal2DoMtL096vJO0kgO3oU9+\r\nBhAqwlzKwMvoEAIGtamc9XqsQed9vtkaABmzEtibf3FdR+m7ta9d1LPTD+0m\r\nUxUMwra4JPoUPC21Y6my0HHwublB41eqU5UrfUqNcz6ZgBRIDtyO522k6Use\r\nZGND5vBwqeqXE0zAesv6Ud3VlRKLxhL4Yns=\r\n=NuBL\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-pg_0.12.0-beta.30_1667327599240_0.4293603750148529"},"_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.31":{"name":"drizzle-orm-pg","version":"0.12.0-beta.31","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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 --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-pg@0.12.0-beta.31","_integrity":"sha512-L/AJH1gAOE50MSivw0HFil4yNTlmsMNUtbkKFt/Aa6OrMe+4LQY2qOUdVerKlEFiuzONnSJUCVzlknxc0MWr+g==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-L/AJH1gAOE50MSivw0HFil4yNTlmsMNUtbkKFt/Aa6OrMe+4LQY2qOUdVerKlEFiuzONnSJUCVzlknxc0MWr+g==","shasum":"455d3c508f29134d397abd59a2439617e86481eb","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.31.tgz","fileCount":137,"unpackedSize":188451,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDLhF0iPK9UglQWbW2s34ix7tND7okirywFQPLTWVPn6AiBCgFSAaVbAWlqF7HSv3pQxIG+5+An6GqKQTb90yq/tPQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjYlwtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmooFw/+IEmdNOT8tl8t6k+7KdEhLwbtrVq4pj6Jxkez6wUSkfsunIL4\r\nfKaL3frsILzu+VqiBvPQqSy8NBzWReIlpW8Fv2CPQDq9EWsQUlh+hPVYGU02\r\nNjXIQwYsKhDuvDRN3SfSjpDFVhwGDFZN0zMGGU8QT/1lYe6Qg2NIJ1XuzSAS\r\nMQjG5ofNdGNwsK0pXHyjx7HgJTvl7zwNzmUdQ1PbcGfc8KIGBItfERb4gTnz\r\nyFBncC2y563mb7ADjRGmj/NRG8hkMF96X+GEbkHBLYeBaLJg31ISowvwTIfR\r\n65rnI2ulbWcw/Rd3l+yWfbgUvk9SCxczKgbs/idF3MQSwsVFoqXKtHTRp3EI\r\n1q3B7r2MLgA6URUyikWimOFxcB+JFQtXOXFA4VllTwGSj8v/miM0LQ9rOosi\r\nwm1L7FI/K+VzUhTq0JIxWxIj/d8Hv5jRksDO9aisALUuMq5pEXnQDN3VAS8b\r\n3If9v0pbQw4abD/94Rzrz+4d0mLpBVDoha7UelHPF6GuZ3gD9H5xIasoDAHT\r\nrmGKbLTxh9GlaTaZZet9NKlJVuNa6397Am6JZWfwfcSG1GckYE8KWiPMOth1\r\n2DIqreJDVZ/6Rl3hXFvCGSTHQVPD7X0mRBbr5o/6rWhgt8AjU1u654CP1EnB\r\nWi5tXV9w1VN91nHRqN63PY1GSsV/CsbBF48=\r\n=O0Ic\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-pg_0.12.0-beta.31_1667390508874_0.7547382769789941"},"_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.32":{"name":"drizzle-orm-pg","version":"0.12.0-beta.32","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.12.0-beta.32","_integrity":"sha512-mRUGv05jGzcsJcwqjstGSFfU38x/5+lHMd8cTbR95Le0zD45UR0k1AmalpZNzPe6trs/L5DxHVa75B011Tncow==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-mRUGv05jGzcsJcwqjstGSFfU38x/5+lHMd8cTbR95Le0zD45UR0k1AmalpZNzPe6trs/L5DxHVa75B011Tncow==","shasum":"a0a7851efae4271edad140c1bbe157726fc447df","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.32.tgz","fileCount":137,"unpackedSize":188469,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDd0Xe1aowxttBzE7gAzC+ewM2uqgjyMqYYVHo9+IEICAIhAOAJsG844M7GUw/MS8JbgSanDzHjRptP49RJeeEXfG26"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjY5sHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrKsw//bUCNCU46USPW6efTqFCEP4IgtO91XpSNDcoFtcJL4B54o9Tf\r\nMSOOAJWFsgP5ifEYNxBMWBU8v+4cqoCpJSQi0VkuxJ1AwMGP8I86+O43T/CU\r\nvUwjM0isa2s9Fkp+Y1RKUgGiF7ejCqjJErz0cjtReBeOvm7X5dcwhsQYaXZG\r\nW1cq9+RXQ4oaN0o+kCq5EKhIyxwWUn0YBrZn+359HJVBFJZX0eDbcOG6V4t4\r\nZCMooX3l79Y2fP0Ex1e6/P6Z0vrT6L68geBwuqCxDZJjSRsSEtx/AbXjZb9C\r\n2WSLrmQK4WgadxHZ4Az1Rr1b7QTWLhGnI0cGsXzRbuVKGPwgWma3J12PaGrA\r\nbc3aMh+sckbXhZBJkKkytLUd8xKwnG4r3mkMyjR1ARY+cEfZ1blqE1WQ0yo/\r\n8kDbiZsU0C+yxBwGisiU8XqMcPEYQpUPoDI/mm/57wSKoVlW7jYJNzKnwlPa\r\nfXlLKrwMWudS8CFzN2svk8IwNjyyNOxs8ElQ9tc8tcHcgNV/ZXrIj78ZiLOj\r\nE+NnOpesXMyr5p9uQ/zLJ65tYleCkHnDomIabtEUk7IyyUjGIn6hoG5Yt/5/\r\nDXDK7qGwkUuVbx36bRLQmETh3K5H4eQ9yViLuQ4MgTz3/kTRpErPEvaIfN61\r\nLS7lkX5laVHupJw+7Qk6uExcr+79FDXUbcY=\r\n=2jH8\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-pg_0.12.0-beta.32_1667472135051_0.6263551706327635"},"_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.33":{"name":"drizzle-orm-pg","version":"0.12.0-beta.33","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.12.0-beta.33","_integrity":"sha512-h4wpzNpnN2hAOZkCsE9uCZ+7oBSEFE9dThGUCVAztTe5YjNjNiPXs3O2SZ11O6HBou+1myq6EuKwHvilYbVeKQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-h4wpzNpnN2hAOZkCsE9uCZ+7oBSEFE9dThGUCVAztTe5YjNjNiPXs3O2SZ11O6HBou+1myq6EuKwHvilYbVeKQ==","shasum":"659f349f88c98ddd6b77bb114e6699f6756d7562","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.33.tgz","fileCount":137,"unpackedSize":188469,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDv5Y15PqbWeDS0hsFatRJgVuv25CiiHVEIPqmA88q7HAIgHrhuuA0wg2sczncbljsVEGcT73TF6VxTvHTEA19MjJg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjY9TpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrWNg//TeyJZ3kVzZKtJOOkmuD31s+cMb1cesaiEOOPKCISsQEozCs/\r\nyOGkIdfCG8SpwpRePVyTVpenHxyijhBame1zPL48W5n79XJZL5vRXLwMVf5/\r\nwhKoLTQL76LHp7a7X4UGXS03LgEyGY2M0MMqxh4MUzLXkk7HVxRT0Kim+pYH\r\n5Vyw14I7ll1+3zIIoSxhyXHVHhjZXotr/z16dfVPqhlW22Taqnj7okHESQKc\r\ngR15esA5nVMa0EsdJf0Ht/lQIosjMs2xRHdl0XZCyP4dVKsXiyrYd/Trfllg\r\nLOHPGDnU2WVJjkuWCQPcQe2AhOUtpAMeLTOmGzK7FTPZXv6WJ5d3E+8bZwxG\r\nKQGPXswwMjHtBaUib9DwtzWtl3wIWxhIFWY/VzJFojvgcVvq9gQ42hjamWTy\r\nXfBa68Jz+iNuJCANSS4eCRWR94+p/3e/s3HA47lhYbQUbkSOV9YvZdKriBAZ\r\nLS3QdcbIsJ700FHTFelXISTQT3Menz84KxYUDpRVLqWHzoknUKQW/HWl73b3\r\n7hcPS/1Qai+wmHdINoIef6C8pgQa7gmy7PZXXIvVzr7sP4Ul9sshwSYMYI5v\r\nILjAZVp8lhbm9lF6Km4fHa5oVoEa3Tsoa0xhIjkALuMrME2fTL0f5+X1FkTV\r\n+1OxiZbmEG1WzoVsK7txF9qcC/nhRqF6dpg=\r\n=yLot\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-pg_0.12.0-beta.33_1667486953332_0.385484721241675"},"_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.34":{"name":"drizzle-orm-pg","version":"0.12.0-beta.34","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.12.0-beta.34","_integrity":"sha512-JGb/Ky+1n+VifnQ3+/bqB4w4FV3wAc0mRqhqqfUjWnZAjPn+Z0M/QZ2nvW+3pMgA8pgWQd4BrBsT5GJsX+trrg==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-JGb/Ky+1n+VifnQ3+/bqB4w4FV3wAc0mRqhqqfUjWnZAjPn+Z0M/QZ2nvW+3pMgA8pgWQd4BrBsT5GJsX+trrg==","shasum":"9208b4bf750114f9fec5a70c80bc2abcd9d01d40","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.34.tgz","fileCount":137,"unpackedSize":188670,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDavv6cQazSJjjGBFInBZBa7J9zLW9wNp0y1Qsz9OyOhgIgZzF6wzfp5PgTXEEbXBvGkE6F0ImWzXTiXsKPzmKyAgk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZNizACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqABQ//YWnSqdp8pdLPKjloKOXn/v7FO3mDUNwfK/fuNVmOfe5LMecl\r\ndBG1Ps+X0w7huKR4G6j2st4eAdoDhRJHe0VJ6O9kRylUePWAx49DareI5+oa\r\nGIVTGyaGOlHPwcbzAYZ7vh7BA1rfcwwRiiu7HIa/kub557XJcKgKyq9+eHJa\r\nT0WbEclngakVR8nsYyRgf1i27157JP/P95x4kuzrcVqqeB4WFRjWpu0Q4fKv\r\nbR7IQhvVcGdrEhRQRKXalWyshJnXP6xipwj0Wa6yR1gmysC5sVCigL7wRLHL\r\n2bGIBwYcXpMWYkn2us08uWJVK7n/A70JIlL0TnX6HUmKMNyWorgjHu/zsc9l\r\nRtb5S8os66L0ssue4igKuk3Dre7fxulyaTSxOv7OshsCeDWaNI/bYFVGtUT0\r\nE9vldGl4j60nyDmmFgKcom7tLe5LNtYsPD46YN02T1jtNd2sYKP5rWjAtWPr\r\nMdCH3/j0ct00gT+bUxH+A6FIUsM3ie+hXohwn2GjZ/r4go38hZ5m9dkbALp/\r\ny7cEJ+6cAGuDuHZQtjXbnf8whv3/DE7bbCJDcabUIQS0SfBi6PzHfdBXYlfD\r\nLQJiptQOYIAsc9WGbaEvfg4Wvw+dD8EvYld2Qt9ccytyBbNzrqYqhrYQDpqB\r\nQ8EQQ9qm9NyKkp2SWnNi3Lv54qr14VCmR2I=\r\n=eI2/\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-pg_0.12.0-beta.34_1667553459086_0.9841361139429325"},"_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.35":{"name":"drizzle-orm-pg","version":"0.12.0-beta.35","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.12.0-beta.35","_integrity":"sha512-ZIDAJOJgPEoc/MGLUM9TzdV6OF+nR3Or6KtOYoSWamq/xjTt2186pRwzUU100xuWEW5zg5clQKXLasDI3OinhQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-ZIDAJOJgPEoc/MGLUM9TzdV6OF+nR3Or6KtOYoSWamq/xjTt2186pRwzUU100xuWEW5zg5clQKXLasDI3OinhQ==","shasum":"63346f8195acd4b7b7d085a91d0d474cae0da458","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.35.tgz","fileCount":137,"unpackedSize":188586,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBBypoGQWjwnrimaenBwzxW/k+GGsLl81dHDYB53K4GAAiEAygIIYPe+CYQ3t3n9oB07H/+CkSWsUQdh7SLZTspjIW8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjaPJlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqxeA/9Gfq2UpvKMolXLDcVU5r/UtmuSCmZt9sNmg6mjeQwS7WM7nVf\r\n7kj85UQUEY2KItVLt4nTeH2JmaXW2JQXcVAJBHOqUhA0XHJZCo/+A8LayS27\r\n1fiXcPCrDjOGuMHoaMULPLTo9zGEQTqEi/C8MOIwFYo/pngW3fB1W85Do/RW\r\nnBA573HRkkgQE9JbaiAO8TF6XrCnfVCMYn2DzGG3pRYMSEDVvfftjE7hBxWL\r\nWLdtKXOFoAcM2UuMZI3lwq+YX4tz1ulNLEVb55CjaMRFCIjY6Pmziiu+otA1\r\nSON3UXKnSaK/73+2OKk1xCTYg86EL0ZWrKf+FcsqmwCEEVSh6ZMgO1so/Mu8\r\nRZKiyVO4JyQLbSRaIRffwgf9/VeioR80XoApjxKrEGLFyZd1xbE4RaJNHLtQ\r\nyJLsZKVbF36Xbg41sHjNFSuLcTJTdGW2ryAwr7Mdcm/UdGEVQYAK4oiAeVFy\r\nOGnKBmRvQ/4pzi5PsyKG8m5l7DC+AoJEe93meXRBLs3bTzOyvnLoOuVypfCW\r\n5qziIhpARWwHPlImOalakWH/IgFbi66dfyC7BkJ/AKpYIYeEKJ5MVwUcZf80\r\nTu1Xqe/788hg5dLYEuzsGWE3uGtc52vrrHK0W5aVCQ1I0ybV4X20ghBmecr0\r\n3/ALCMGs/h/DJfTkbsQa/lhgNoXeR7E4iqs=\r\n=UsxD\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-pg_0.12.0-beta.35_1667822180769_0.0900821663628728"},"_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.36":{"name":"drizzle-orm-pg","version":"0.12.0-beta.36","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.12.0-beta.36","_integrity":"sha512-emgI/9hZxqh3S0fDzoL8eVTELLt4hsFo5+/O1cefCHadLc2JI0t8vr6Sp4G/2zUdCOOe275Zo7h6y9yCkr5KDw==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-emgI/9hZxqh3S0fDzoL8eVTELLt4hsFo5+/O1cefCHadLc2JI0t8vr6Sp4G/2zUdCOOe275Zo7h6y9yCkr5KDw==","shasum":"af4163fa29d70a9cdd386df1d419dc3a252f6876","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.36.tgz","fileCount":155,"unpackedSize":205438,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQChOHYIdNVfIICm000sj0lYT9hexuqQP9Xeu45ael6bnQIhAIFDJKyMC5W5rRfE/2uGirIV1CfUwgOJnE5ybtw6kDPT"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjche+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqqnBAAiq7jgXdQTD/QBqqguy7FRfMh4EJUoRLWqUj+wh6NNvaYAR7o\r\nvdIwBiK2tMVZd1Drs7ufXVnBZbgVa4gkgWZrQZOPu2KxfYIAnA+y6Sh3FUj9\r\n/mjf3DnntvBntn/R9rofpy0YuOylbd5qX4XRGVCe8VbWd4fuiV/VKSx1ZH41\r\nX0SuoyIT0yErZ9QaAPzndFlnfWMSqSzHair3Kt9GVXtfUgeK9Pn0l9ibFMkQ\r\nbNf+EBiuOn/TITq4kVYHo/LIPLFqITBewbMwlrD1A/cNH+UAUNZEbWZP/55e\r\nZhiL+mxwd/7hEkMbEmjup3teKL5LtxsLJvhycIhjBnoMkj2j2wJreqilzuUJ\r\nZsPeUw7SBXa1V9kNJSJLVMHhVUp0m+VIR3wdf/9kRFzuKa6WF9rdlicaXGK9\r\nR8WsbWCVKTlbXGJKAxLvOlG8aG8NGQQyI3KyXzIcZ1NohEDO4q8TU/FQjXxi\r\nMGMw9NqePhP4l4p4tZNwtYVzED+gpxaT/t0IN40LLvMXPUjFFKVHesEuw28H\r\nz+uhTfGD0m/tn98XAZZStNEpJ2HDPRObsSjbsKshCUPCnvcIwySZvAB1xElQ\r\ne3KM72iQix0rkaQT+eQGEb5tPnfuk5OVtopa13tkkzMPyszWSZkBcSO85qcU\r\niY9HTVSTniUuiTtij8DpSeqcuLtlwmJ7Lik=\r\n=dW9N\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-pg_0.12.0-beta.36_1668421566111_0.969502105720973"},"_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.37":{"name":"drizzle-orm-pg","version":"0.12.0-beta.37","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.12.0-beta.37","_integrity":"sha512-ms6bHYEH94AA12tgQZsGmGYjH9K+mmz5Avim08jkpksSGA7sf/mVIzTQ3ZLNQkaBOLVRPBVazF8ZZLApoRKZ4Q==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-ms6bHYEH94AA12tgQZsGmGYjH9K+mmz5Avim08jkpksSGA7sf/mVIzTQ3ZLNQkaBOLVRPBVazF8ZZLApoRKZ4Q==","shasum":"31ee63f22a91772ed8c9ed0965defe40842b8894","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.37.tgz","fileCount":137,"unpackedSize":188743,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA9NqsWUPzZb3seMTLJSCaQJYpC42n2V73ihUZcjxGMXAiEA68Y2JZEscVaZrMzUtqZKTWN94BZvJ9R579S1zHwEGEM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjdP7oACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmophg//YvMrW6FULESTsnfcbpJz2w93Ofldxpn/+OHJoVvSImbxtlq/\r\nJcVs4s0sc/R/V5DFNp0aujqbSPPEcTcPVwkkE5DD+jrHNNEnWszf7UqfFpek\r\nEJ/n/prtZb37Y9pwBVlIwi1lBQ43jEDoqe51THZcgDFndNcBR8y3rulvVHs6\r\ns4tEfXE9ttOR4WC1VYcu48EY5KPSOmCRBHvqoeRsMtRg6y/6Kx7Gw3HbC+Qi\r\nKIUUEGO3tgxN60yvuQ7kbHnGl4Wq79rxPAGCEOMf1c9ZSl/jQgKizoZe+u5V\r\nO5mgiFJhgeF+KCsQEd3nMsP4xVseit5Ve7xYHXE08Yx1Tcm06ZGK0mFOB7Os\r\n3idKfSae5xcpaNGof0LEji3Iq8qoy4Qd5PUx6fi8FzvzNfz6SVJUfWkiU/XI\r\nD+BfGwnB5OpcKQQF0rGyRTn2G1RO3FICr5aEtRxqFUT5Y4WBW8b8UI3IiHK5\r\nwtMdh5tODFNjgfCtj7jYnrN4M50NZnSl3FW1I5JbuKIHt/u+h/KMimSyccaF\r\nsQ00LpNLuetE7ymGbRkEvDhKCUmKddmHwjMNHyfD1kuS+a6t87KL2NTcPU8X\r\nq9s6+ytK5i2g44uUMOiMO34PLYIxakt11qPI7p2LuiUQgSryX8WQYIlfCRDK\r\ni5ulPeI6afUfgd8dqP2xGo2GUex4L3kLDdE=\r\n=c6no\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-pg_0.12.0-beta.37_1668611816009_0.022696308052630565"},"_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.38":{"name":"drizzle-orm-pg","version":"0.12.0-beta.38","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.12.0-beta.38","_integrity":"sha512-IHrNzHojioDyx+c78EhgjTiDXqmErJOK0ZYfFOD1QNbxSXqtZcRjG40yL5zM1jKYxJnfzOiSCPBlXOwWJ6zdHw==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-IHrNzHojioDyx+c78EhgjTiDXqmErJOK0ZYfFOD1QNbxSXqtZcRjG40yL5zM1jKYxJnfzOiSCPBlXOwWJ6zdHw==","shasum":"eda3f0b560c386e155fb2437a2abfa0c4969cb84","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.38.tgz","fileCount":137,"unpackedSize":192207,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCqAg7ssS51FxfKIovdFl/05/BSuztLNNzOxJnF1qOtSAIhAKNKD1uaD/QCixErhKXxBuA3daE5xLb9PUAyBD1XN5r7"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJje4MoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCMQ//TMwQHV6MjJgmPMVOyZWqpHSp8jKKQ16hMHBcYM9a2+a+BtQz\r\nxyBr7Kh/kksiW1OzqxaGhwR5NVrmPCAGEhFXmV5y4J/uYXBv1q7+ux0PQDqV\r\nAul7s8e9IbOugS1sdF2euLxF/c/zzC7Zg6ZJqLauOwraP32J25Y4H0kzB97L\r\nv/uZl/VHNfggNiSU9Q1dnlHlhwrqOWYtRYkb3s+sVhNE9eDygo4UnBdikRiT\r\n4wGVQDIXD2jbLk1S+CrfNRJgIwDRbuBFLPc2rHMAJVCYT/lky8QzueK90Hol\r\nYrodvGkZ2Gdc/Qq/EwOsgHaum4LNzzmKWA2jHQts/H96irbHmClECuw+UR9O\r\npnG4AqsiFvseEM1QrQVSf8odeqS43V6eN5nZLiEDwYv4Hhx/URFbWUkoyzJ+\r\n2BAb9kN1uB1JcE3WAcagekcpbCoypze5IHjuLzjd0Xrq2jFspEJNf0GwJtME\r\nfqZ9fwhljETShDhn8GLzPlQCWn3wIub0+BHX40lIP4Pi3puU8+uoMVUYlkC/\r\nebaAqN8xtSC3d9m3ExcJ/en2enVGQoyqwJpez6+uMo0MIujmzEcset8uu/7h\r\nouQJxVGhIg5PesStbU2e5cV3HNYR1kDBp50vHQdV2AmsG3P2gyYl81rBVnYt\r\n2zZiUaZ96s1hJdEg6DUIRpyH2OdS5brYgXk=\r\n=XzY1\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-pg_0.12.0-beta.38_1669038888217_0.6234199371818498"},"_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.39":{"name":"drizzle-orm-pg","version":"0.12.0-beta.39","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.12.0-beta.39","_integrity":"sha512-EOszllDMNHu12oa9YMiuhPx28fGoH1uqBaw1uyFeLRl74PvzdCo+WKO7rbaL99RPP0nq1iuwlstIkb0ymWQrag==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-EOszllDMNHu12oa9YMiuhPx28fGoH1uqBaw1uyFeLRl74PvzdCo+WKO7rbaL99RPP0nq1iuwlstIkb0ymWQrag==","shasum":"dcd32f5a2555e4d774433f0df04112008092bbde","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.39.tgz","fileCount":137,"unpackedSize":191826,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFGbZFXObVdhLQRFIM3seazQm9a+z0tf2XWHBFFC5pUuAiEAguMJltPm+8qwFHCsJn41i7dizEuEafZv7t4kYPu5+JQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJje5PAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpmuQ/+K8y77i+UEcZK+9iv9kXd4/1B/p7FYWZvJX6xEMU6PJ5MKNdN\r\nYIHxzwXd8edcFxcKGOeUUUmvKUimvf30zGPTS5hfJukgzevctEMs7EzZZQD8\r\nezaYBfv0hmg8HzQoUhcF1tmtI3QInyMph1ncAriYLa0IpRRWIi+XQcp+TdOu\r\n+5t9WpfXlG4MJUmWv5HY1PSk8buQPmqTGdMdiHkwcW5It/NnQGjle3g13Tw3\r\nUf7dxZgtU4QXzDfbo5aP3Bkstl7CXvCaij5nGAItsQ/McnrqOyxnOFjf2i8M\r\niDbv2VMU99K6KT4a1HKNhtnchLbkoqt1sr7y3rJx9y9+Ln0JIw6zAeCoOBc7\r\neR+aLd5J3CSwKDDqe5Ao5QZ1Gp1kLtdINtBcpxlN1lllLpED0S6YjccxGxjY\r\nskGb5ymeA6vBjQV0STvBAVrN2plJzST/M3TxUyksjnm/19LnUawrs3mmVwBG\r\nCF9Gj4hr1OVAPh8Kkz/z9JFRRlvdjMqSfxLKj03cG18NwJt+KbPoCTH31vj4\r\nxAOXXevXbJkiHAlIZx+DvA1gOWoSEeZdr3Z/5vVlvxWhKeFq8dkdUgvbpWm4\r\npmttaqP5bif11U186jwxmUaqnObhGGC+dsINpmj98QPnNiPjubLzSy8nCilD\r\nP83IaE9vcwQjWcE2jJcC1/45ONrMTCO3Tao=\r\n=bGy4\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-pg_0.12.0-beta.39_1669043135978_0.5265458658107225"},"_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.40":{"name":"drizzle-orm-pg","version":"0.12.0-beta.40","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.12.0-beta.40","_integrity":"sha512-atxvCytHS2ZdCs7SqRyC5ti2P/DW7e6ohWr113eF/0yZaDNQY4h0GrDPWY1Eg7C4NJq5B62JE9NVgQmea92R+Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-atxvCytHS2ZdCs7SqRyC5ti2P/DW7e6ohWr113eF/0yZaDNQY4h0GrDPWY1Eg7C4NJq5B62JE9NVgQmea92R+Q==","shasum":"1a18a20612da5b00fc8b81d8232cb17b174b883c","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.12.0-beta.40.tgz","fileCount":131,"unpackedSize":189384,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDHsTyrW2HEZlGLjGC9O0BEUi/tKsjPcq/vfi+Ay2KUVAIgf2WqkptRS+dZzHey8EoRvQb1EBqiXHeLHgM6iXIhfF8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkgdAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoStQ/9GKe6wbrukBGJSlJgvkk53idQ2JVcWxQTSAfivmi9eI/qXivI\r\nEwbbzCBFUN9I7Hz0m5aeEDNDtPptGlmZzbstVAIhhzv9g9UvWeSGYJXH16Rl\r\nW+Sn4s3yokhbi5P/q5JL2OOe5cc3241I7+4EDQkyoGLF+GMunobjTepFjjDj\r\nwU4ud7XLXPaBPafrloDcCXduzZMLcLwlHzTZGPFFRq4EqdL7ZDCT2i2CNQ6S\r\nUS44n2KFOW8CTu+GVMaA2TdNzT9Tn7DweCOKFKOHRB4pJeZWE1tkx2piUoU6\r\nalyeNyFLRc8i03Q7Gnw3eklgHbmOj674auiYVqr2DtFJifGKC4LFY80tSa3Y\r\nxF8GL9k+t5dZHYi9WsPhgXQU5y81mvYWiLLwyBCF9OeTgj7ANZRX01Ay9q/Y\r\nkfYpW56G0BS5USAu1XFInoeJjrmSXp7niub9IHc9DFmexGOuTyebhLlTDsJg\r\ne0fMj950a0ZtI9ygDtdOCP6Q7D0fOkbjBoE1z+trXJ9QlxOgJ0S2JAkM3hE5\r\ni3eVJalygMXk6H+3ohnI1PeEHEyNl0dplbV4mnmFXm906qG5t8FFJZMu/LZj\r\n9oIOAP8yc4reB8jtEywt9rdL6sq51SdW654XK03b+WM63nUvOw0Qp+zW3Gdw\r\nZ2/f4fqXH+2MtdCAhlHTsvVY8I6zM0/yiII=\r\n=rMkD\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-pg_0.12.0-beta.40_1670514496750_0.3022754181188574"},"_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-pg","version":"0.13.0","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13.0 <0.14.0 || >=0.13.0-beta.0 <0.14.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.13.0","_integrity":"sha512-wV7I2p8lJFiQdtKAv1wr6M37RAn3gdbLRO7ACkmS7wgrHDAWhWb3xaS30MP6gsT9oKu/MzzGxT0tAvmWSsM/dw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-wV7I2p8lJFiQdtKAv1wr6M37RAn3gdbLRO7ACkmS7wgrHDAWhWb3xaS30MP6gsT9oKu/MzzGxT0tAvmWSsM/dw==","shasum":"0e73b42701648c7f71588b2a4684e6164ebccf26","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.0.tgz","fileCount":131,"unpackedSize":189376,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICLegu2zADrq2k+w1mk8CsrL+hOVUdZOBmDtpALgZwadAiEA3ZGYpydRivbkOJcCLhJGp8X58GgxczGyRsv4fY71I9Y="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkhIBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr+qw/7Bl0j/K1DmaT9IOFEuyaIn0S9LV6pPQvV29Duz+TudGZIbnkg\r\nGHThBiJxLRAAg16jWJ3y9OX0d1pzGxA7iSydYpt20b4mayBnHiHOnKJA3c8A\r\ne3taNWJ7aPCqXmanDDWqJyWYLhMG2hoUky02cCoG0bACjm1O+DjAH1xdq6LC\r\n3D9CZ4qoyRh9ApVJX6cBVmPkyowaW+JxYTQ+/sZibbWFlNdQ04EhUuxZOiWR\r\nisc4HFwyzrCqM/7GPi5ISyL9U6wIVlRW3Ug4RI3p+BKjIZxnWedY8zZe3j9B\r\n8ndg9zxWfL7M5TXj55aKvuQ2Ua5PjOjkFOZP9SyrERLU1Rq9pYB08qm/MUNt\r\nZz0VWExcWPuUiK7ZrMm4Qf8g1/G8AHGBiMKMBmj6MUEjRqXHQpbKAfq8htFe\r\nTzEm7kwqJHGKAqwkGdb0bjo8nKnC4ptsYWMIP9OcQIA98Kd2cBEENOmX8K+w\r\n052UvxkGceRTHBqMMVLjleQk91s0yYu+fCGOc2C9UQSdvh8nldpq7Ioaa01Q\r\n0Z4HXYLM7Bsu6Gs1DjGUctu7M7cjG/ullw2IgLdrhcm8cvg+96jF93clqnGd\r\nFfmM/CnUUbHGa9E966Vcvxjz+hfPU+5kWwMMU23WCWXpMDbkMy/Av2FiXakr\r\nKXycULDwRVjHYMAzEv474f5NP16asTzdgb0=\r\n=PrVd\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-pg_0.13.0_1670517249522_0.9100255452238826"},"_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.1":{"name":"drizzle-orm-pg","version":"0.13.1","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13.0 <0.14.0 || >=0.13.0-beta.0 <0.14.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.13.1","_integrity":"sha512-oJY997v+rIIlN9UkOMpE9uZvl9AB09DZupE3f6GGm/go4KWNQLoZYlgjXyfkNbCCxgt1nfUFlOC7vvAgf5fgWg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-oJY997v+rIIlN9UkOMpE9uZvl9AB09DZupE3f6GGm/go4KWNQLoZYlgjXyfkNbCCxgt1nfUFlOC7vvAgf5fgWg==","shasum":"8e16c51c83092846e41b25ccfab5abd609920e51","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.1.tgz","fileCount":131,"unpackedSize":190514,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBEME5CglG+Zb/7phNrCCFk00H1K6Swo20D1nhXqw7tUAiEA71X8hKHowFoGHg7YvDgoG15PrgAQJ+mVEdNdJTYk2EI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkyd+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpLqA//SKOmUpBKq8GIP0OJlIzTny8WbUsOFScwrh3sfTK7rR8rBDK1\r\nyM9yFJwBpS2bDWzzdkOKLQu/QJTgM+5Dk1zakJZrIkAyoB2MLES6ZiIBnOb+\r\nYANb88rCPb9FiAT4quuUsrwlW/eXWY8/wMHVkAwzqgkH3R3FhdU5qkVILaWh\r\nX7VwQ6QbbBVy3URR/l6nO4J2M0mb56eQRxSPiERazQBLidecZaMBpRarX7aO\r\naDLggWN5KeNYovM1ZwnryUpRxyyhK4FUKFT5crVadjdHgQXkYGf0e4frLW0K\r\nWCCZucELdMNXZQs1AMbbmN7spCWqmk4s8u9BZyh2nQ0qwDsoAKq7kZDCyFaY\r\njiDzwXlK+kKpXBbo6INzggClFv5bpUWAfl4DT3cwPDORYM2g7cxd3N4glkK0\r\nrxqFqIgC+qxXuOTOHvOfq4JqCFLKsHiELVt0eAB9TuZ4nl0Y2gz9fgMC0XfD\r\n+m1fsFH6t+2BcSXE7bNE2r/2B3g8EuCGFSTSSS8c7mmvrfmNJmh+02uJZFvj\r\nsSMGu7mi8DH3Trm0Hh5XqmidDy66Dcg24gPJbjEzp0YI6NFeTArXD+hC2WmX\r\nyu5+yLWVVRPCZ9eUsrRHioOaDcZYd9w8iB+hZOJXeeXXacsN2AkLEVtyvJpQ\r\nsccivhVUrqL3Fos+58WsmAr1t9vB7/CE2KE=\r\n=MRIV\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-pg_0.13.1_1670588286068_0.4521161767239792"},"_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.2":{"name":"drizzle-orm-pg","version":"0.13.2","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13.0 <0.14.0 || >=0.13.0-beta.0 <0.14.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.2","_integrity":"sha512-iLvAOQnXz7+5Y0e98o+Hw1CnWCzCHVwpDTGcRONGiwyMuTjgwrjFfScb+CBgLjTekcB4myYx5eOW8wxnA7L6rw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-iLvAOQnXz7+5Y0e98o+Hw1CnWCzCHVwpDTGcRONGiwyMuTjgwrjFfScb+CBgLjTekcB4myYx5eOW8wxnA7L6rw==","shasum":"c75908671b19a9f1a29e2544491b26b926fe1249","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.2.tgz","fileCount":131,"unpackedSize":190508,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC1gLwQMtVdOaHNk9oxhGcfrS5C0wAtxTut6bLM8v0X2AiEAvRfPaLAOM06t5vwNFuFKXtp7MpdSY4fnU4zQ1oa64ec="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkzYVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrQ4w//cvvp/GxPkmNGjf4C7DoSkwHuq2I0EZxedz2U69c7VAXjhLw1\r\n6CkB1Wrp8RHkd77/lyY8ZJ/EEcQ7lCeWuQab0npa8O83XjyZV1vBeYDn0q+R\r\nbRp6fIcqVUQn6oh6dkrEwI9zeLbFEo96qeMDuEPAw6KViFcHutvtQ6u41kXC\r\neqInY4OhwNlOK2MsVAWX21/A0HHDqC6o1maKRxiMLUt6ut+hmxlUYIUBbkoI\r\nQoh98w96lj2OZbxQWXX8aJJgwN2KgBMsJN4eV06aQSIvDQoGtW54MvQUPHkY\r\nUGBdU+WzzI2nhFoaEN6koLIJ35fnUoLFnfV+5AcrRHl/akuek/pDQU0g4oxe\r\nFULMVTRJIDSsEWo7b4UPL1KKqDmMFVJiPIHefekql1qApW+RZxRsfnqNwyyW\r\nyQKz11tQjjZW9HlOKD0zMfuIYMAXVWB6waetfIYflwqWP7dSehJzDfcRZ+M6\r\nzUWSkk4uIlQkwFIOh1dExpy2j3Xlb6PCxHh62lBfPtgsLpqTGd7j2R+gVJpV\r\n3EjOyrAMjI8MhnYmugtaJCyaWlwq2epF+vQoOF4i1uebSbgNMkgyjjf3Z/PO\r\nuiYW69lVQYmb7BCw91xSF/MkaShK1iEABdkJSsgaBO9CEO5bsiKvYmMamg1n\r\nAQ1aC0Cfi5VWxWmmY0pePZ+q8a+MS2OqqKQ=\r\n=h6hN\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-pg_0.13.2_1670592021262_0.8926218436225044"},"_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.3-beta.1":{"name":"drizzle-orm-pg","version":"0.13.3-beta.1","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13.0 <0.14.0 || >=0.13.0-beta.0 <0.14.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.3-beta.1","_integrity":"sha512-tlXcrsAoZAPCAim3cm2/njRR/pycB28JbrEN6GBlZVCm2GbVXQrese1kppjdAwcSj94hFTz8aPIezUdjZSonEA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-tlXcrsAoZAPCAim3cm2/njRR/pycB28JbrEN6GBlZVCm2GbVXQrese1kppjdAwcSj94hFTz8aPIezUdjZSonEA==","shasum":"2536a76e38b4bfa2df32584bae7ee47637682596","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.3-beta.1.tgz","fileCount":149,"unpackedSize":210568,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICUJAS07fCskxmXnGIKarm3cr7VU5hCLN/0mKrjJ10G1AiAM18Nk3d/ge81sT0gaPidTYjD5BHRKZgUOVq8X2MgxxQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjk2oKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo6TxAAk2M5zL/lC6GVCinw+VXxNqyJ/oTWZGQ7Ggo0UpaAZbbFDe2E\r\nZRMS+3QQwRCdvE8eyFhlfdnrdAYmXxVnNc/hWd5AsLeM+FE12voz47Eh6d4L\r\nesgwyTXMmz1WR+wEogyFT+ZgsZCh2PzjT9ZY996Xcy/5DoSohp7x3cN+lWF7\r\nnL0xAJ/5VRHTMiweBccj1hQDRzCX+ZfNlSdqItkSOqWVaYqlGu0tawq3XHVe\r\n4OGWgD72y/YNohM+hFQZcM0dc3nFLQA3hrZimI6qfcdX4WOgBmHHmIvD2jFG\r\ntzXrCJZlVc72XxK4DkPVgeMICxGwCHeDUVldMQIk0zi7Wmkix7G4sUSogtCr\r\nI/apq7zI884RGw25OeSjCTIMGOrsALtL1fnsz6j1wCR77hlA49iDhS/j53z1\r\nq2NnqGXUMT/fKoenmlulN0O+pJa0sptoAWba0QMPAeARaIkBU7eQT6RpRg4U\r\nBTTwzyDaR+D3n61SHEQB6ujya8/fzSj5RYOwb1oW8scuFOXo/nZwpuiex1Lq\r\nGE6XGcz4AXeL8fJGp/faal+AjjFJIVVOUgpthsi016qCcTCH7FUA4rbXY7K6\r\nu+bnPFbbdf2VJiMHObikfJwHtJjHK2JrwDCVXCdMcGW/4kEu8ATEsC+YGKLi\r\nGuMbQHXJt1ZrbLXBbx6w2KasbJIGZW1H77o=\r\n=RV/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-pg_0.13.3-beta.1_1670605322246_0.30908851400273507"},"_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.3-beta.2":{"name":"drizzle-orm-pg","version":"0.13.3-beta.2","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13.0 <0.14.0 || >=0.13.0-beta.0 <0.14.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.3-beta.2","_integrity":"sha512-10LwwWtiixSb3zGEa8G5v0Mok2KQThZ5RPHMqf6KGAUckl5C6oQtB3DoX1RykkS5uRDSjq3L7abhp6J0mQDhhg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-10LwwWtiixSb3zGEa8G5v0Mok2KQThZ5RPHMqf6KGAUckl5C6oQtB3DoX1RykkS5uRDSjq3L7abhp6J0mQDhhg==","shasum":"7d0c061b58ac5eaa0ff60140bc8dfc9b444b3c73","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.3-beta.2.tgz","fileCount":149,"unpackedSize":210596,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFzJlR7uajuxKQEIEFBe4tBGDuq7p5Hmqr5lk9GXrq63AiAlXxDZXsooOlM4AlXqX4sKfyFz3d1K3Lw8WlaobqKHEg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjk30xACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrOaA//YStscvhNtD7an/W/5ugmPLvNrNp9hy1gf9Mu+G7GNwYB2L15\r\n82UuBvRVKlVCKzhn0mnxoNujdsxMEf06TYOHeJi2M6nntv9DZQSzy9kUrSYv\r\nJq+K+1S3dnjvPdnrGNQdeyUPTgV3ZvmrLAX1thZwMOU98OKh082eS7QUjAir\r\nMQFunMLDbFLFa64+Lf3qMPq8TUrvlM1ySYuk0PbrSGzAbl9rPIh1RZ2w95bx\r\n4f/ITkyZWbumOnpXU/DwXKhC7nHTlY5VnSPF4g/MVu70WsD1iEwv+DfKHwo/\r\nTOXwNTpJIHfnspZlS3KaWPlst09rihHVAyLwzGRd8l57X/THFdVrbYJ/WvWa\r\nM0fjb/3jrIihWxmrHCwY9wGcTfamxIOG6pKVb6be1VIHhCbBKpwd/mxiw0Ww\r\n56mt6PwwOczu2eBUGn8oFBaqCullI4auarDnY5pvunQbaIZgL5uvLqynjeLo\r\nsr5qU3phHp/2Fk+hP94H/+g9rLse2kX1ibBi2z3cJzW9GgSfDluqB7xhJxFD\r\nMS0AAbn47ZGNemyPkqb9kfxldtHbguDwfMe4nBT6oJFOU31nhS5PbayopHyK\r\n8lQ5iNmwIO4R0cXIjJWMXKCfezMt7ziJpNjJaS6zUUMtAJjavUcURO5p1Xv0\r\nYwVCJkAwlgPZmdsW2rHNPMW2nrD8JxuBfPk=\r\n=1aeP\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-pg_0.13.3-beta.2_1670610225165_0.9949922750765192"},"_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.4":{"name":"drizzle-orm-pg","version":"0.13.4","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13.0 <0.14.0 || >=0.13.0-beta.0 <0.14.0-beta.0","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.13.4","_integrity":"sha512-c2ohvNQOIKqn5ematZkHlkhCc+ndaUVF+3+UxDcQ25jcggkIbnd4mXklJEzCXSblStv3LGjeKwlY9F7gxZ7NTg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-c2ohvNQOIKqn5ematZkHlkhCc+ndaUVF+3+UxDcQ25jcggkIbnd4mXklJEzCXSblStv3LGjeKwlY9F7gxZ7NTg==","shasum":"2cc9c136156d95ad316ad60c2eeecff59f592220","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4.tgz","fileCount":150,"unpackedSize":222004,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQLKVLqlHsszHorJ4ndAxgg8V5iVA1/6Q9TQB8iDBzswIhALQODwwCaZGBIMl66rT0h2K3HX0nKR5yJ6DFwChxJliX"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjlzCXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq4tw//UqPMbc8YoTbAlW8upXXBL7kTGi00RU4rPwfjL8kyXKPZIRJW\r\n/77EtjnsSoWTdU4XseCblOWf8G3eyQCj5NP/wqXYpeSX49LRrdZxOuEpWhZN\r\nFZ2IqpPQaXT+C6HOQWHXX19DQ4co8NTK21bB32j1v/JvInBVBvryLnFDqYnX\r\n/IIn4VLpDHM7uFY821dGuSDa/ga56kN43oK+lyBTQTC4W4ATYOql1Lb7KdPH\r\nhSp1eO/LcSCMSKjq0HoSMmr4ff1w/XvDp2lhBMq/KAgl+v4AuPOPXUkezQ4i\r\nudVdzemgiXwDIodwFCiYe9ezjvNVbVMPPjjHGtJUEcGrLDwmobY438HFPMVN\r\nahhlYzmshMyMLzdwndqalMlOqCB/WEkdB5ei+R0uBtsIc0a1DDKQbG8ysKSy\r\nAlneSuPVMcdXjJDosGb47JwG+Q2Sl9TSKX19xvnogdMeDeMnUvVWrpUCDrZg\r\nuQmN1I8lcF0Oi6qHlgcMs2aGDW+Hh8QRhGokbPm2NYnVmdmTM+dDgaWQMQCX\r\nHH0EvXzLgsN2chNPqidXF90MR9ELMdLKh05N+Q6MW04eKBHfgLl7EgP1Pw2s\r\nCSGDkaegsMmIw/OWixfo5htKlv66p+qzie8I1VhyQ30vWrTvp53ub0LCdBvC\r\n+ddzmjxqssnbpQwiRWlrBl/HqUiYbsdHx7Y=\r\n=Ezdo\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-pg_0.13.4_1670852759640_0.4924296054752215"},"_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.4-6924c130cdaa28e770d96cb4300615910eaa3da6":{"name":"drizzle-orm-pg","version":"0.13.4-6924c130cdaa28e770d96cb4300615910eaa3da6","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-6924c130cdaa28e770d96cb4300615910eaa3da6","_integrity":"sha512-n7sYW3Lx1AwgQyEqDYda/ECeiLFnx+qFV6KdjmcV+wbKZS/kGAhvrnKSrDIRBUofaNzlJXPQ4harhyaLXe7bGg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-n7sYW3Lx1AwgQyEqDYda/ECeiLFnx+qFV6KdjmcV+wbKZS/kGAhvrnKSrDIRBUofaNzlJXPQ4harhyaLXe7bGg==","shasum":"7d1cd7d3bad0c9c33fe6a19750967bf5b4621582","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-6924c130cdaa28e770d96cb4300615910eaa3da6.tgz","fileCount":150,"unpackedSize":222007,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAUAZa/R0FV9eGJn76sxsYLlaFwPGJXWIwT27OJGANpdAiB1wB8ic9V6ds7oHz4mv05E1nhyH22hdNfkFD5jlqJEUA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl0TRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqnOA//Xlk1fPSnYB168G9C8t9UdrtNPSrVaHXWwtLy7SPFIh+kW7kP\r\nZy96TMSyibQNDF3bI30uMcyR6fR2Td72JRuT9vd4eTqooKE6e+3pfgbuoS4L\r\nbwj+HogOeP7Ib/k66z67g0UHY7o3t3VBlAM27Jfk3Kz/pOpu7acBDr3BisIE\r\no6eheHiYOG1xXNfrdFT3UZ5uarmTT3tH4c12AAHYwkf+kzWK4+xLxvYqVYqn\r\nB0CD029Y84cVugHhsBxNIpdxsil/RK9UpVVYBqlcrB8xYDsCY6B7YnH7EF4f\r\nkntHSz4CrCz4wwe9As7wPdEfCtTfRliyskhmYtMwQPybPcoy4zbhW4NYY/5x\r\nt/CVpGReHOwQfBQYbycsoCEOaPpAeMgH5bCPB4vG6lM+M7x3ti8uYhvkGuSP\r\n2gRs0z/LSnYhvPuSMMnEvoZwJkscwFwKPOOeZp7epvrZd2JwLlD+QL2dBYO/\r\nvYOVtpyuQ/u0uMh4Wb2BPzg/S1cMOupPAfBuFRQGxwFMk8nXovTyWJp5xeiw\r\n+IwDaUg8aFaD33NzW5z+FkaCGBNx39HJjLx74X+oKzXG8Cx6aB8pWud3e/Jp\r\njI7ugLgDGosoJPs0up002xOkOp4O4JySu/18Q6MBAJHyrhRRV0vgfAtGpbwW\r\nstqRBeZWAptx5QC7sUts3NvWGzXsOt47stU=\r\n=dkNH\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-pg_0.13.4-6924c130cdaa28e770d96cb4300615910eaa3da6_1670857937196_0.07512855447762234"},"_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.4-7d422f2":{"name":"drizzle-orm-pg","version":"0.13.4-7d422f2","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-7d422f2","_integrity":"sha512-w0BHkhpNsIwqjFkVwAk3xMr2/9Tvc6ZS5MYDHFNR0QFkWaX7wJ2GJenWix3UsVS8hGpXT+hkGp6oYaGBibUwig==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-w0BHkhpNsIwqjFkVwAk3xMr2/9Tvc6ZS5MYDHFNR0QFkWaX7wJ2GJenWix3UsVS8hGpXT+hkGp6oYaGBibUwig==","shasum":"7e8cb5bc699ed0a42d3ec800339e8bac0a3ce052","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-7d422f2.tgz","fileCount":150,"unpackedSize":221974,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDqo/rmjWCmKomtlsQdQob53rXc9bgGNkgeFiZLqCr3iAiEA7glCjc/+IBR+mDCY7qC6NBkjkOubttHgMREBvcseMJs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl0e2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoVww//TQ+C3yAnWM0ZiBGsjsAdEx4dNPzYdG5fU8E7qV6fm2ah5wP0\r\nr8+B74c6hLaEZAbhSAH3gFjpJJO+jI2PP8cZ/CELqxxCxwbjlZmRfZa5rQgR\r\nRkBZpIdC7XhErQrN5EL1MpoGoWUrDNlD8P4JP+2aEO+KSJO/N/RAxNMlGCq1\r\na7KGe98nsmkWXd0zQpypgcrFrGS2bUjBEVjQLx6qLsAtNw9V3UsytdMWqYs9\r\npvfFChBXXtw/87WBcYKvqb4F80mieeWfBck60g3NUM/T4w04XHjW43bzjCUH\r\nAwLC4HNnsl+fcW+8lFRjj9Lg0Mb7e+wq8cCDd+RRWFshTQCU1d7tWD2EQYBz\r\nQKuuiyFdzIzAf5oviBQVnCJMZvNlAkTb08JqzE79AuEmkN2O9ItdatqdPRqZ\r\nVgSFcVPXngtv6hwfUbzHnGPZr/HB6CpHekr91aG4H9BntVAk+wGw47loYMd9\r\n/11pfHne5ewwKNmuQTzPx60ooEHT1HtFUSNOubLyX3UAI+vEGvh1gsUeY8gH\r\nKxZ2/Q5N2p9j8Z7xymDOzjY/9zCsVIA6XfQ5WTGdtI83qUKqga0QCPtUQ1AH\r\nWAbzxSY0Orhms6NvGU4DzmZgSZVCtyEJUFe2NaJK1MovB648aygve1sHRLbB\r\nna0A1ZustsTvP9idUkyiXs2xEMIYbuz57OQ=\r\n=n+Rm\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-pg_0.13.4-7d422f2_1670858677805_0.25269325263675224"},"_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.4-a61a883":{"name":"drizzle-orm-pg","version":"0.13.4-a61a883","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-a61a883","_integrity":"sha512-oGYjQFUj7GjK8mgiMsvZqRg9DSm8dG5slJnsdrz1Kf+8uuM9Lv2AcYP+5LmOEDE2WFAwiKZTLWGGyVKpT6BhVQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-oGYjQFUj7GjK8mgiMsvZqRg9DSm8dG5slJnsdrz1Kf+8uuM9Lv2AcYP+5LmOEDE2WFAwiKZTLWGGyVKpT6BhVQ==","shasum":"e96e9029f9b6a89ae03c62046b7f6daac3f7fdc7","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-a61a883.tgz","fileCount":150,"unpackedSize":221974,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG1QXQ4mpNX79FSt0PCIVEO18MNPBr5saOVrRT8xJzpQAiEAjJaZkZ5bQNwp8bDYWNGVg7zIzy4vukQIhjnLJRiE6DI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl026ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqHNg//ak+8hJLv/zykK8PWzWuk6LpU3MuYpiYIY7lLSdIkM2W8/i+s\r\n1PP2P8DcFJT8AjfHVcT3a0/qmNof8Wc88Jns84y+gHtlwA8Dqpa/9GQcqtD9\r\n5QWoNpRBPVdLfPd7cBaIpP2mKmpXiHorQDgzDpdi+NQu0ZCWBJypV67MIxru\r\nd/2e80R3GJiGeKz5TtmH0I7PqBYOIJkghPXthvlYOJNa2jRMFG9b65o0MxFW\r\nsUX+ZT3BCY8m3+YBTPQbFhFK0WZ3GuZl70OMexhZinCNkdBOF+ALfqmc3pyW\r\nLh5MZY4hPSM7lYzyVKHTKaTy+Go7FRtg6wffWLrd/6NjcaaWmMPPnGqJzASS\r\nwAJtQBKmU+70teydYhkQjEZon8tmYo779gCAQ3VZr9EKf4r6CTBhLhoe6+XN\r\nLubSvH3yUxgNpR2GxfYwPNEv3j9LlAwJJPRLO7GJDqTPeR1eWAgulR3C0GMs\r\nzHEOCMt14R7nKQhSwJNUCLjE+xWZeSSZr9T7w/DlcDf4ldmOz26CJdOY969P\r\nFypn4tLXsKOzXFiry1NYHbaVLwkb5oXpfl5migUwskK+K3VnElcnCv9QTFlo\r\nhdljd+nRuH/JFP+0M0wfPgl6imQT5TQPMIt9OUI+UlKDed94J3wUXoW3D3Bc\r\nvttk+6g/QbkgGzcBNjsKhe1jVspAYOPy6aA=\r\n=C8s/\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-pg_0.13.4-a61a883_1670860217833_0.7300173421141083"},"_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.4-6a923f2":{"name":"drizzle-orm-pg","version":"0.13.4-6a923f2","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-6a923f2","_integrity":"sha512-ROpK9EdNGw4WXEVKOng1KlOy+D8OC52IOvuhF47EFsvbXASXbJeZLex8RIGig61LNegjK1c6vagKy8KWGtzHUg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ROpK9EdNGw4WXEVKOng1KlOy+D8OC52IOvuhF47EFsvbXASXbJeZLex8RIGig61LNegjK1c6vagKy8KWGtzHUg==","shasum":"c7872dfe15b27dd6d2c0d22a9119d8e245e8239a","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-6a923f2.tgz","fileCount":150,"unpackedSize":221974,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIACsJ/Rb1DIuuoIcRjuB+ZsT3QtG9O2dZUKZP9PCROaxAiEAtcCHQszsP9rlqJefuJUOHDBu8DnaHLqHN/8HnrfDoIM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl055ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqneRAAgcJTu/SbweRnGPswFbvu5rk7LGkuVZ9jYDXp7QImGZecWFgB\r\n6YheseVsjF76RMlT3aeDfFP6QxZwKtX/ZEhBAoYZMqJes2qlxtJ43FzD3jq1\r\n0UEAx4e4vdUHEpaas/W5ylLcJ3DsTWvDTvMvUX7GcO02T13Q0wxucxF3YDZP\r\naRtnwk9JXBcQ6GU+VKyCkMQvdI/w7Q1rep1dG3Gbvoas2u7ngXUT65T8Fdvv\r\n5HKyBxLP2kk2vPwJeCxBySBc0QBKtdCZmJXotzZS2BkifJJN1xCfg11n2eoS\r\n3Tr58Xl082rWlHNMCLncAIUv/KxcHPyd+GqMTM8QqNggUxQ3++Dp5/V1C7ii\r\nn2i1blAIk2rDJ7/aUxlkxkX5iCvOCGryMmRdTyKxHYgQCwlSeKuzqoydxN3K\r\nZBbkSII5yd8aWi7w6uVpD0ccOE55pUkGjeax3iG5ABOy/m0GF/NG+mbxEEcs\r\nZ3M50SxD2Q9l1J6Pa6uJl9yCuN6pPo59MNOCTMiZ8JCcBqB7p7U27CZMMJRL\r\nhORNnBXXKAQPCakWSyYol9aYwLhJFGWjV8HKdD/zYG4x29f/Hgz7l9VwSosN\r\nuLlVBlX6fHEHG0fSng+GWqVTZMsQIvsTI5GtaPqZ7ekCilk7LaExceHHxXY9\r\n2qSygpzIJlPnttGbiBDaCg0r8tJSn6owa38=\r\n=Tsnk\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-pg_0.13.4-6a923f2_1670860409597_0.995349040618722"},"_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-a7bfec3":{"name":"drizzle-orm-pg","version":"0.14.0-a7bfec3","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-a7bfec3","_integrity":"sha512-zU0rtTuUaGYgStuW3Nsp8BZL3z+Gjj8I/hFC7dmDQ76hIPQspG3KX/5b64t+BXduasqjZqrr/VVJgPKVHKTRSw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-zU0rtTuUaGYgStuW3Nsp8BZL3z+Gjj8I/hFC7dmDQ76hIPQspG3KX/5b64t+BXduasqjZqrr/VVJgPKVHKTRSw==","shasum":"147ffff2b1da2713b7ec34065830d277382fa441","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-a7bfec3.tgz","fileCount":156,"unpackedSize":222856,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDfeh3xDsmkf70Hl1OO6BAYg/tkcALoSCDqHQ/FyXPsKAIhAPuuVgej+lIQF2QUN6NPVkPrIkEFxcGunB8UzMkwZbkR"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl2bRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp9Ug/+MkSHjjnNum8+vXXP0odoCXVU6L7NIfJR5RzkcYoymXwYqra+\r\nQfPm4hfSNjTK2vtd7H+bcSwsqCo9aULcRPnvBhu3jg68gIC5kBC3WYPS5t/t\r\n7tKd3I/1RqF2V2EZqyjtWohQHggV2CSKSqtDhm750mIOC5PlYsM3xkt45eeY\r\nrgv07Juzcr+YSSTRcCKff5EuoXBG/66oxL/OyqCv0gDr12msDFDF5OLBtXqt\r\nX0y35HKFd6viTl5ItUtPvEnyfZl5HaQvtOwt4d4yqO63NQYpr18oqvKntoDZ\r\nGDWcCM0rPZaTHfBtrnf77tMV7bL6l1poRsCB/vpjCnWpl7W43NFt1bUQhDgQ\r\naQc0rbFHmdbFGgBL4d+3h4h66MoblHtU6BYsjYpNYyM9qCZfn3lBAv0nV4tu\r\nadcNqpefzrP9rUbq/0XJqFhxn5UPL0DPmtwhGFamP4Q9ONWOQm+HVWUyTvNN\r\n3RwQDiQK9kBagtKEu45b184YC49C9qjbZshyQyl/xgLjS6nMqsde40ZaNSuW\r\nVmQTI3HKzRF/Er8DPtv4l+dfJ9IE6ZlzMTPLGmhLmyZjLKBmPZ2dVNiPHihm\r\nb2aXGP/V8+GQzPqDXNcSMHdb7VXVP8gH3HKe8TKVei/UBWRyKNAb4wN3F+jU\r\nrI1lUrNkM+U/aSc0qY3veh7mOMR0cuyN4yo=\r\n=GW28\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-pg_0.14.0-a7bfec3_1670866641665_0.6964150366216972"},"_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-pg","version":"0.14.0","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0","_integrity":"sha512-fe0Yczs9LzVATQbeRvnBn4KKfT8w6ZfVO1r1crUl4MS9BvWaD3FvqQpb+RlvJysSgWS7Boq6JjgVxfGNLB6hPg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-fe0Yczs9LzVATQbeRvnBn4KKfT8w6ZfVO1r1crUl4MS9BvWaD3FvqQpb+RlvJysSgWS7Boq6JjgVxfGNLB6hPg==","shasum":"9a998699afea837f205346788d2d19d0a3c74aca","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0.tgz","fileCount":156,"unpackedSize":222848,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHqnq+jQjeFz4YaHNxzL0FDMsj7cpIzsTssCFNFtt/+bAiEAgpBPXUPAKn9Kas8p7fYMNlJdq0V/mCXE0xoD8llSVr0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl2c8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrjyhAAmcc5AEEXysuefRaYSsjMq19mGWlNFCjyCcvRHcxTCGinXkf5\r\n4osDHPZ0TN5kvB0PzPmdHSqYIBtd+GtcKi+dS5TZGtBt35Bwtokwev7heeFT\r\nBoA8KjWmYY/jbsXU3bPL6dvlTjO0CqRKryMk0Sw/2XZC7xq+e4qSolHrLufQ\r\nugN7bwAUhXrNj7lRQ+Kd0ToQ7mbByOgHA9ghVPpk9dc+25Lu9DrsB78RTmEz\r\nnKmAKax2/AJHjTRzDe3QaDTg3FuKhwghd6nvAtxhQnfVBMDmLB0tBD6b/iB6\r\nZi1qGa3l6qql4xnojK5ppYIi7tV93HMR30LLR+0AfARRw4viqecFRbji84bW\r\nKJEZdUZzsBNly7rkO/9I5DkCJxzZtpALug3koAifoyEcJBC3U4oFUopP1E71\r\n2pmozyOYAxvEBd+jyjiwJ7boRJnyvcXuWDlU/4LXWsGwi2xIXi4wWbJeUcYn\r\nMVYxqwEJTR6Js1rDphNyG+qB6SRD4qyu3KwfmASFoGtz9JtFPSf3SwJzgdAq\r\nYTjzRtJxrnkxNw3cznl8TiTnkWvA4pZQ1gnVnxeGtreUd4x1sUyKXwqstKmd\r\n1dyLabvLIBaGxhCSrRBAnMMg6xmbbfHnjRKnHqi0kkgjA9fV+AuZbTeW8T1l\r\nFJjCEPVkGDkR5ACzcU7zdoGBHbOsdu1axg4=\r\n=Q1gH\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-pg_0.14.0_1670866748614_0.04602236731214804"},"_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.4-cd3f5e4":{"name":"drizzle-orm-pg","version":"0.13.4-cd3f5e4","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-cd3f5e4","_integrity":"sha512-cOU0wanwDigm+TnbvohS+lJQTYDJ4//B0VoaLP5g+J+9srARGjsSE4JO8nKitm6mHKisf2vBIHVHGeMQ+e2I2g==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-cOU0wanwDigm+TnbvohS+lJQTYDJ4//B0VoaLP5g+J+9srARGjsSE4JO8nKitm6mHKisf2vBIHVHGeMQ+e2I2g==","shasum":"7060fd4e85640d4797e443ac1241f23a0b0ead3e","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-cd3f5e4.tgz","fileCount":150,"unpackedSize":221974,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFAL5q3eDRHA3IgyFhnMIy1gRq+YXw7JTgG1Jpiyf7YwAiBPwqxoScXbJN8t1vWxNZUY/5S6nhPYxGWrwIp8rS9abA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmFNIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqHzA//f1d8ppDm9IJg0JALw9YL40/hjkjQ123IbF4GIxojoYeltgeK\r\n+X419wCH7g1M2FGLTvGgE3Nv+Li434tT2BdiHab2avMSmVnV3o9gCt6dutEP\r\n0WMf87roCkG8HzIlPIEnTui0y4IuSp+SmOL1bsZJg/YfVaCajy1NlWGCKQLM\r\n4vQgQw10SoQcVILBPgdLRqT39sKMkV1unrqbv23WufCyIBRXlKV2vWjdm33z\r\nfr2Hf8EaZynureEcKi1enXJA91oR6TLFvvf71SxUHDvcYTIStAe/zbF2h4+p\r\n26v17iZmIm7vwpMMu1+xNsMKvZAJr741E5foaJn6d8+9TYGLoAp7mrIcRQGs\r\n0sFK/TagWqyd+2Cx0pIsQxWAfZI4G3wwmipx9v6W4oltBrUN4xaVes9Whyk1\r\n5AadpAkblEKVjFv0t2OpdZIaTmr0tAPj1n+4NxGqSNKdr+hJ1H+Oynrj4y/E\r\nGNa/VfvRnN14hRHH+S8eegACExRE+IYxKBmapxhQtPMYUz34e3EMdXKMhwil\r\nvBWGJuAfrhw5NtyEm8MFi1C0DKbN5kefhxK9hzOwJqhEcOFHgZPCbn0eJhuR\r\n+yRi45/0/WpnRQG8lgq5aa/n/dYPXNfk7cMIrTaROBuyONh+wP4bqnDo1jfU\r\nRxg/5uuSTtN46SLvDMPfED+GVjtSpBMWL9A=\r\n=uAjt\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-pg_0.13.4-cd3f5e4_1670927176216_0.46786202257077525"},"_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-pg","version":"0.14.0-beta.1-44e9f79","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-beta.1-44e9f79","_integrity":"sha512-FSx5Hl/SFaapv1JYt3Fq44N8a0SpdV1+DXjR2j2w48UZPRdH4Xa1t6rUQG1Wam93dRU41NWCIB5t2PBcjUrNWg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-FSx5Hl/SFaapv1JYt3Fq44N8a0SpdV1+DXjR2j2w48UZPRdH4Xa1t6rUQG1Wam93dRU41NWCIB5t2PBcjUrNWg==","shasum":"1d1876984ece89025a45943589265f0646d11aef","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-beta.1-44e9f79.tgz","fileCount":156,"unpackedSize":222896,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCHkw5gjerMKLajUYyQKB8w5naaqlh1hEeYIxse5mf92QIgd5N90CxH6d7ZFBmzVatyUBhOlr05kiNR9R1KJxCGkuY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmFhzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrtPg/9HXZ+MdAHRTbV9qvwUJKLw4kaYkJWATj+rg5OqzV8q7tNY0Ik\r\njOwCOhFhCUg3Vp2m7jehKDgnDWZfWveRb72UnJMN6/coXWh3O/XLtwOt0LsS\r\ncS8E62x6UyOj1Wn68PjPLzzJMaEEMJYpqfs7oBXiZJKsCZfS7V6Q2Dtyw7fs\r\nIzOua0DA1pGysh9fUUnJKDHDZsCK3vaBEqKSnylbTVI//v2mgX6vUbkIghaj\r\nDE4oRpBlNEec3TB7yx5CjdAiSnguz312vllkr/VqWq31uPCkeZjS6dl0A8SP\r\nkMm9LckkQYpCUgOG/VCnjiep2fubarTNKV5O6dIROuB19Kp6ikwQaKDzwiUY\r\nlpC6OigX63IQ9i593Mf+nIJuh+YhDnhSqbBjpsY7g64XWb5lJgYln1Y1RJXf\r\ngIdDMhLDNS98aDnmy+cCNSwPhwnZwcascKUc+Z3QZNq8xvkUTbVfFZjhwbDA\r\n9XmlMfjDRGodLhnOZNfxMkItJeJ1y124bLCwH3IIiuyfB93YRlR8O3nrUwgZ\r\nBVIug/Du+5kz5zQnHs6NCbkkJfk0dSuK3qVpIFqS1BGviFoJrJeg8+WHMHWA\r\nx8zPpucoI9qyWau22eUQdmBvcChp0TwpflI3GZQcM/pPTLCzVODZU8fMdp+W\r\nbNg66476d/4oovfA7JlC2BfrJwY+urOUSq0=\r\n=Krio\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-pg_0.14.0-beta.1-44e9f79_1670928499681_0.5918022333117481"},"_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-pg","version":"0.14.0-beta.1","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-beta.1","_integrity":"sha512-xI+YLs/Ji5nexVh9QRbIWQ92HVkXw2D5KqGXFpi4pv9lz5qIJV6LPBcKlPQW7A/1gJtolUzb5hYXdoTkjZFWiw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-xI+YLs/Ji5nexVh9QRbIWQ92HVkXw2D5KqGXFpi4pv9lz5qIJV6LPBcKlPQW7A/1gJtolUzb5hYXdoTkjZFWiw==","shasum":"e9dd004cba0e00a78ddcf84a903be633437d81a3","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-beta.1.tgz","fileCount":156,"unpackedSize":222888,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1To4B7ndFi8zPDufxzNBaLGR2tMeruWViDZyxTWv4OQIgUStItnfcYhHP1sBl7d68VIc8iyUhDD6qVdfJ7V3pyXE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmFiDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpqXg/9Gasdnei5NBM7/UdN6O7+8dvG5wWULwPVIVPZAH2FziL8/SD8\r\nQ0/i30CNsMPqpmeHZO/bynZYwBmUCCEZVoege4t97oyAzfotvwN9jy29Bfa+\r\n8ouW+lC4xBTPpTEETCZkhjmUvM+sPTmKrJIbReTCRLoV6nPlmRtzGuyF/JkR\r\nJJC6NRfscgdHj52EXmHbXqP5WCp4uTECppiVTBVWa2vuylEax+fJtIC3K1++\r\n1l5Aoe6+wdzGxqnLJhputJZKxDz/i/nFLvj8mFnsKk9OugCr7AV0sqLi4s6R\r\nBo+2FcnondwbMTOiil3PqvG6tB6flYdbCPSTu6js4ofX6oNkqlB3bS9sVEzC\r\n7Ra8cMRJDirUN1jvWuWhykDlrMTAI4ApciPSFR9fgEDrQaLtQVCELXY2CLJ1\r\naGtXMjX1XM6wSiDgBrhueDH1+xodgJ2OQOwbX7NnRFXy4P+FCI6DEJYz2XMK\r\n066g/m5q35YUazZI1T+ZJDNIFX1Vk+jlQmspkv1cI1DoHTlIifUQFAXwA6jd\r\ncubijI3NdhU5SbI718LtBKvheofBFA9SGCthwP8/YnxnzBBQZ3Yma+uTNNyR\r\n76qxB1rK4qObP3ICRp9Mpjm2IxDhwcnLI2awb1iL9DY0TzeiDu9aScaEzAEl\r\nqn3BcevbT5xXfwCjTKvHCIKDq5rjCdgJd8g=\r\n=w5Pl\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-pg_0.14.0-beta.1_1670928515029_0.19995289708776243"},"_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-pg","version":"0.14.0-beta.2-f67992c","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-beta.2-f67992c","_integrity":"sha512-ouBma65WrEq8YIJPcwLcy6Y95M696W1wSQ/Emxa6u+b8PBD1eh4xv1iFSP1yutlFFdo47nro6/uOcmRuTDnQng==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ouBma65WrEq8YIJPcwLcy6Y95M696W1wSQ/Emxa6u+b8PBD1eh4xv1iFSP1yutlFFdo47nro6/uOcmRuTDnQng==","shasum":"7d3235e90309998bcadd0ca2e77cbd0f5bce51b0","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-beta.2-f67992c.tgz","fileCount":150,"unpackedSize":218758,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCbgYvpwL6Uvey00/EMd8tCz8/7F61slyQ8alzr28D2CwIhAOOS4EY2uLtk4MSwHaScJe4pwYvdTSyoHBKHFZPgL8H3"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmG8hACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo3YhAAn5QD7lse9kbsI06IiHytjDDDe56mF/joIyZAMWfXapX03RDh\r\n7HZgagG4cmmr2voWCRHpYAHrgNQNJ4h7UL7Z8OBnWuhTKWZ5dW3XXwocu6+p\r\nTyHqVAeL3hcLarKRmo5tQED02qCeP9stYZwlkvofctzaTPwwg/ty2/S3oQBZ\r\nbsk/S0Krv8oUbU5WfIesd5g6lp3tFLol0XgoG4Q90m7CQxwxtrUAqnoJRaOQ\r\nwlB0nZXRjylDEPYwA4L/mmk5PLpxKhJm4iZgVH/jj1ydFksKlCGcorIiQo5b\r\nPlTHDddTfhd/h/9pxXE4+CHz/hXq1/qAQ85y38Cv59jkY04/2LeOkknTWdp9\r\n5go67vZKoEVCSyj269gylR80OSAGu0V4zSz7EsIIVcsFa+VGh+/q999OJwvy\r\nZmefZ+u/9olV9bTVRm1SPIJt4nwKgtOWZj/+5V2WVEWxGRJAACm0QERRh27F\r\nYRGgtP6cR0igrLw231FevYsi0LGRUG1BlAnJ0rN3N0txcGVxlFGgnot3o4dP\r\nHKBnziuypAzbsdFhw2tiRMTLbvc2kl5DjrJ/lH9kFoqrufBRG/0pG1kStZGL\r\nz1RaoWaTX8NgjoH5H05Mm+5F8h7FGa3tVLZWJYPz506qS+bUvnMyuXHCneEQ\r\nd3B4fc9F06iRdox8ffhGHMNRBo/rcLOYIGs=\r\n=7VeV\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-pg_0.14.0-beta.2-f67992c_1670934305269_0.8608943906609534"},"_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-pg","version":"0.14.0-beta.2","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-beta.2","_integrity":"sha512-KeplOjL78VG1PNzxfhkfCeQywMSfn7FgfzPa+B+VnQWSxxhu9nKQEgYW9IWDovP4X1w7uXKpFnvzqty+xGl+4w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-KeplOjL78VG1PNzxfhkfCeQywMSfn7FgfzPa+B+VnQWSxxhu9nKQEgYW9IWDovP4X1w7uXKpFnvzqty+xGl+4w==","shasum":"e12da98a431093a7e20471f84ed9ebfb25b507bb","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-beta.2.tgz","fileCount":150,"unpackedSize":218750,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHdpnypgQyfTQ6bXvt/cPAqOBxBalHeaxQzHr6wPaIOAAiBYipXRdqQa4kd7BmaVxCMxtJ8LzBr5Kr9MhD8n7vgh8Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmG9eACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp7GA/+PBj4RMReJ8ANAN4g3/0+k1CJN+NCa/oYTbgSwwvh/Im8G9m3\r\nlSbH7Dn6fpe+baUd2JfBnWH2A9JmtaffHnY3Jk1B9DND8qDyxewfnOmf6nhz\r\nOa9kEJ/Kr6F/eIBARwq095E//X83U3kV3ZgtCBzyFsKXP1hbwI0xXusPIFZ/\r\nBXzTkQAr/18bbDzkxGj0SXhtW8fQa0TNY/9rNYZTGx1oP7l9jExvIGo607ws\r\n5/iLNpA7PDI1bN7o1QcLHw3KMrg+GRvc+Y0phbu5H/kX49/jwdVH55wRmfX0\r\n00mbbYSUVARBLZt4Rf/38ho7oQpTD+cyWGpNy8nET3bOlLb7vh25fWyQQjBH\r\nMdiVoga5+ql5aW3CkcHShr1rTlNiIkGxOGQRDp/LkHiW+eeuUpo9Y47oTfka\r\nyB+MUt2dDtzm3RevlJoI0KEehR87iIcOWq2AqF8emj1HHzalOkyDG1F5HOas\r\nZJ5TQp8nvZKORfD+d0urrgr/2Z75YTskgXmwKzZDDYsjl8R/fsTNd+K+dpAU\r\nM1X5HLO/PbWOg1n/kr4fWSdH4Y28ygL3AQSOBjljnXj/JX0TGu+gI8xnBLTZ\r\nCZjTeHJrzX8lD63GSSv+YdLayOfp6BOm4egjO2TAl+6d867H4H9Juh2FoCGE\r\nUPdJwX/c131Eeic+qzvncsh8pdXY8LXZCY0=\r\n=ukAz\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-pg_0.14.0-beta.2_1670934366148_0.4093851501975412"},"_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.3":{"name":"drizzle-orm-pg","version":"0.14.0-beta.3","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-beta.3","_integrity":"sha512-cfAM0z5oFKScQm6YPVbAZL3UmRJAAOMvYUlCuxB9URRmh13ICtWAlCbBR7kpLRB3p4aOTb4eQCEosjOSgfR/bg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-cfAM0z5oFKScQm6YPVbAZL3UmRJAAOMvYUlCuxB9URRmh13ICtWAlCbBR7kpLRB3p4aOTb4eQCEosjOSgfR/bg==","shasum":"469158c6366efe68855d1eb8c3904730feaa3ebe","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-beta.3.tgz","fileCount":150,"unpackedSize":218750,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDv2oRWGRGahuqtUkwZVr+7yfJ1Xt19a/RtYI6YuZEmyQIgfd5tdH4eSJmhTC6sHTpMpfL2VRNO2NjhR/ohstgAN+0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmG/zACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo/Lw//dz+h+4G0Um5yg0UaRTxQeb5pNgw4A4DFcgbjpPa9hLdebbSy\r\nDwIpXcATAknC3WXlfBTv1D2oIOH3ULDcq3jq+zPx6oFwWwHjowKYFyMRiiLt\r\n9zD7sZbJWYxe7fJLvSFF6c7S9p7SfP2uSf/bTWKoqWmsXmjBc4KSgkDp94NT\r\nQ6g3DSUc3sm9WSUWlVQyRZPKK9YF8FAdS+m042gjicEKqVwOGP9Qe9rVTBKW\r\nx2bbF/p/gT1PSg1U3W+fhOe5t3DK6pjnlmlddq/FRqYKpg6BCYdOUpvWHlkP\r\nSpGRVLlribogOA9G0czAerkyJiQjAcTAy2xXRvckxEWknAqsGwxsQc+R5Qpg\r\nboFT+VW8aecGBsZUZ6KgNxcgvFflGh8eYdOkP15Fcq3LhFgzyJDrmDeYOn7Q\r\nGyNVtH2blqUpg2NhhOKSzczhE5EwHo94vqGmMFj1BhQIRPiBH5z/Izpj3cFy\r\neTWH+KomxGyqzRwl217oDW0lqmIH0fuDo4MVlgcaij567NVJVPM/o2gneSsx\r\nOvHZxVF1AqZPRGcyVBUbS4M0z+MXrqX/o5F5S/R/ev4FcP3Ja95OXWj1jFrY\r\nm6zUFC+3i1mNBN0qkk8QauTJ3cOtcTEc5/10Ld5lQ+H2PIxmXp1pcl8RA3Gv\r\n7KyDznABmVSyi3HI4SCD1ASZQBllZU7A5/Q=\r\n=x0j8\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-pg_0.14.0-beta.3_1670934515753_0.2509547580963285"},"_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.4":{"name":"drizzle-orm-pg","version":"0.14.0-beta.4","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-beta.4","_integrity":"sha512-IWqkZMzXbkwfyW3VdJ17XBlLnEhK+zPfoeMguGtqN/Zbh7Kt8ZpVqjtlci5+kbvIa6O2nz9u1UwZjhcdB72aSA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-IWqkZMzXbkwfyW3VdJ17XBlLnEhK+zPfoeMguGtqN/Zbh7Kt8ZpVqjtlci5+kbvIa6O2nz9u1UwZjhcdB72aSA==","shasum":"b79fa60d549325171bd2061df349dde478a5ae24","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-beta.4.tgz","fileCount":150,"unpackedSize":217963,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGWFjz/JNMlI3zWcBVYdOm6F9QOf7Ft9PBJvGB9/CUH+AiAuDcUZMyxoTMcWILGhLMycKG/yXPb1F5sy7TS0pGHPDw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmHB8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr1IBAAlMS4RogDYjp/IeuMRLbqjPT2zZcaapuw+pCa5X3drzajQ/22\r\nQ0DcP1rQ1S3GKV8bzxUI+BpPkU7FpLhvdWxqUJOuAACq7Ja2HU6utUKxf0pw\r\nVR94sP/v8WDZSECBEhWluSMFRD5yZKULVx1hjIMcZ8pfF9GxhiPSpi/Sxqg+\r\nL/oqgxBWJ4rKcBCU0KVy60sX0bO7yKn8bpELaoEk7bl4OkQX4ABarI8fhcin\r\nTZeqamx/fT1m/+suCybqKYqgao4/cpgYvTlxmwqXw/IogsK591gVY3l7WMHB\r\n0lUkhE84NX+VZz5RjeMBfNqoM+460VKryjGbVszmaHUBGyXCIo9YwOFb/J4k\r\neUH2aSZNPVryn7XmQK8Y+q7zdO4tmMOZ+mUu6LOLlRWEHElSJVZcWGdps5fF\r\nXsIgzubxAfU6qmnjzTXvEFJ2CWGCViAzry+wvAU9FNnMnWJEyUcbHrnPmUGR\r\nWxsL0zVV/geF4c3LmTXbn8z9q+vFMonrAsmiDRNA1cz0kRu8v54uy7cAR8PY\r\nn4kGRjbyO2suL5bmNYn+nt2mMwJ/XHsjdEXpEBpsPsijeSXynu/VazWXFBFB\r\nWuutZgyNJVGbKC2nsC9zZRoE9t1x9YhCKJYwPWJpzRbFs8zmLgVt7wuIllhf\r\nAAvmnbSpT5dVOiJoxzQkuT5/r0E8a8DlxP0=\r\n=i0n+\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-pg_0.14.0-beta.4_1670934651807_0.4807526291760835"},"_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.4-a4036d1":{"name":"drizzle-orm-pg","version":"0.14.0-beta.4-a4036d1","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-beta.4-a4036d1","_integrity":"sha512-tYXMZhci52w39yMfk9t2VCK4PRmwtD+IWyuc67yKJqLqwMCK79nSTnXuc5t141rdJGqF2JlE6DfyYCIYDIXvfw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-tYXMZhci52w39yMfk9t2VCK4PRmwtD+IWyuc67yKJqLqwMCK79nSTnXuc5t141rdJGqF2JlE6DfyYCIYDIXvfw==","shasum":"c6830fcfc15e3b14d18507ef32c90e63ed8bf44a","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-beta.4-a4036d1.tgz","fileCount":150,"unpackedSize":217971,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICNZmjJV1JVwtKWYbs8SCrDpKEWoU9NJuGZQtJ9IU1TvAiEAn84VyKcmlCV9TqYacBuiO+YTZg3pLhn9giAod/LsDEQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmJx8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoxtQ/8Dtb/M31ZMaRHAzNPunBGIIDNbqIRxOM6ruSd10QAudnYN+C1\r\nRA+Vm2pZdJ4eDP1o5j/DIBMRZEIFi8jB1MS9z5GKI4ebBXvpDE73mRApqABd\r\nH8QlEHn+13DxGBoegIHPyRqjRpo/OmUCegtnt6kmgqANa6BIMCFFOVQ2Llhe\r\nUTBG/3U7FynmDQcIqadtBI8tlMQnVblm/dhnSn/scYq3vcWQJGOsCoCpYFA8\r\ni7FirNxAVRb9On+nG2ZAAePxBDQVF6+opUpmDbfFm1skWlWG7yV6lL3YMYET\r\nVGqMZi1sa1PKbQdXmlIdvgDmsAgWH5i0VfAHV/0lClOozppon+xf3ZEyZLCL\r\nKpSr7u+rv4Qru4Bodes5h4lIcyHL44DbeLTjNwzrGTRx5XvUJptgyfyVdctu\r\nO6uySsd14XP2jM6j6Dp6sfp5ro1YOdxf+BJKdRCBrlTQlsz2Sq27/USTUwX3\r\ngwhoKTMzdbExgZ05aq/8CCAYMQS5mxQ9Zxxrzxi0Ia9sG069NJAcZQYZagvo\r\ntmyduEO2KiqKi8lfspUOuW9WHkd/rPZVPna8d+9vIZk3eMob1gUtBMbPlEiG\r\nW9g9eozefF8hwtVFu4tS5N2Cg0lomhYZ26BL+faTS6my4stHhfms5Yk42ldR\r\niRhXlFXMPatHbPvZeTs8BF2jDgv6VOoAD2o=\r\n=pSnQ\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-pg_0.14.0-beta.4-a4036d1_1670945916409_0.41994083563966034"},"_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.4-29bad0a":{"name":"drizzle-orm-pg","version":"0.14.0-beta.4-29bad0a","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-beta.4-29bad0a","_integrity":"sha512-A8RBbnwSqlgrvxYr/lp9Q2EOxjXAUCzAsn7adufAacEH9BpwKBKgOpWoChydnrVxyUqaL1Ty5TR0fZUQb064qg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-A8RBbnwSqlgrvxYr/lp9Q2EOxjXAUCzAsn7adufAacEH9BpwKBKgOpWoChydnrVxyUqaL1Ty5TR0fZUQb064qg==","shasum":"fa7e52e19d6cff946c5ac8dcd3d89d87068e15c8","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-beta.4-29bad0a.tgz","fileCount":150,"unpackedSize":217971,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCmRUiEoBGTUCstrllwH9pxSAxeAVFTNXzMM3vFxUBE3wIgZNBQJeLSkXAPIHT19CnSHQe6ujQ68TZKYHN+zwV9aI4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmJztACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpQDA//WlCZ9DbCd8UB/LrQ/5gLM2WnEvff0SgqLzoHmY+pbuTavbVn\r\ngsR09dmDciayexxqSpPm3/e1GTk9b8dr2cmny1gRUlcZT4aqRBpQNu4P4eif\r\n0+T81RmxS7p5HyRcrK6Lk3na3FOyWU2jy6ekKFQKOfZOTadrGbhr04ihIWoi\r\npeh2vqmXzmY5D0yKE6OkyjHDyGmUTP27Gqcqoc4fTYr8nOsUVo5x6OGpvKdJ\r\n9lwJFJvw3oxSMq/PN9WY+Y3k2v7rWEmEtr99m6Q1CXr7OUychVonvPuUGVCV\r\nKTXLvm3W5KWWR6+6CHoaJdSzB/hZ/fbXZeVZivgweUWqCJaVX89kd5+TfpKT\r\nyFfoM6pUjLmjJl56EUOKRB/OoydwA79n16lz5UZk3FEJ2lmZx/lJO4mjzq+k\r\nvOTdxLwkARpn9RIVSeu7MQNs77aprdupxQN0FaxlmHwOxmbUyY3gFU/zYhHB\r\n4MDZGY069Ijo0SEsex9b5LsWosbdb7CATBpnEpHfWSkJrpUq053YrjiVIN8/\r\nRCAfs/QKcWB0qO1Q7461YHMUdCeYgnZBN+5CbZKezPnnkvmze9jKOY3KLMqa\r\nHfzG95j9dIxbFioRkSoOrotiZ7wtpO/yijfjeyeFw2DvDWwvRTVb4mLhlhqP\r\nR/qHXlOOlOe7DwiaY08cqHmscg8KDQsNgrA=\r\n=Mnst\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-pg_0.14.0-beta.4-29bad0a_1670946029135_0.5154496663282078"},"_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.4-97a60e2":{"name":"drizzle-orm-pg","version":"0.14.0-beta.4-97a60e2","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-beta.4-97a60e2","_integrity":"sha512-YloP+wHZ58UuAwoCgsagLlFr2/mn8tbStj9G9g6n09y5AlLklKYyRw9oYdujbeRw1ZyVubqQEhiBs5Go8xwgMA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-YloP+wHZ58UuAwoCgsagLlFr2/mn8tbStj9G9g6n09y5AlLklKYyRw9oYdujbeRw1ZyVubqQEhiBs5Go8xwgMA==","shasum":"4423fcc8a4bbf802080c7a424858fe3129930f56","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-beta.4-97a60e2.tgz","fileCount":150,"unpackedSize":217971,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD4LAhWbNVyJYgEXWOb5OifMRel7peDdsZYXDgsfFEOCwIgPD6fS3SKQUrpTf+CRFyaQ5qwGyq41e1SPeze4lfL3dk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmJ32ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp9mg/+Mj8F7LHZv69zprJUg96D2qOxi0fs/RWoLrkFjNdAV2Al34o+\r\nV0sPi7sC60eZnOI9hsxOuCmPH0xbsdT8/2o1rF+n11ikZqVuwWwqA5l87aLg\r\n5RURD1fzjxn1n27LOa5sQB6j+nMD3uJZu3rLDO5NTv5zKEf6aHpoq0fJqDUz\r\n5wHpblSAl+SWWWQGB0GB4N6c+fw+JawlZdNnU1rMCDXnxiUjJ/OLZfS/FZpE\r\niCyqRmtoGArPAZz86YaRiKvkE0rPx9Nl7HFNo4RxopHTbT4bIpj3F+wwBS7E\r\na9YSNDJCWobWe6WHR9CEUQAW0Uvo29mYR3ZyQ7phVmrzbvB/EAw7kIE3/END\r\nv+IA/xE/hCZVG0s1Q+gH0891VLQ4zb+ZWV1EbXWDKAnEE2KwJUeNyVP5bVTn\r\naOJ4gpdSZoR79AY8LY3pbWcQiS0N8J6kVy2AgDGUGxmd8vkqomEHK5NpXvwO\r\ngSpIRH+i/R7JPu2OzXINrEHrgvDvl47UC+hWDctj2/5uhOPJp6GAZeJzHWGW\r\nvXBB6zShfa19D1DOYIVmyg+ld5SCuSOGmWqia68ZyECeKz5ExgOkrEoVlNa0\r\nX/lIxOKvjZK6TSugPEVGYFgd+Hq4iZVRoKgWN1CPzfTyDF+2PduxfWRB1jYf\r\nHJxLME/zY/jTojHllvBkgH/A4/BL07abz90=\r\n=sowH\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-pg_0.14.0-beta.4-97a60e2_1670946294064_0.2967147205256304"},"_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.4-a35bf74":{"name":"drizzle-orm-pg","version":"0.14.0-beta.4-a35bf74","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-beta.4-a35bf74","_integrity":"sha512-UHqvhYbwKktMuP66pUppwfuYV3wODTTEwuuwvBmneKcaiw/rrhiptM5jvyxq/hC5uAkNZi4LvM1xodcvnftTGA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-UHqvhYbwKktMuP66pUppwfuYV3wODTTEwuuwvBmneKcaiw/rrhiptM5jvyxq/hC5uAkNZi4LvM1xodcvnftTGA==","shasum":"f112d729df14b0d9621ec278aac3105130f6c44f","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-beta.4-a35bf74.tgz","fileCount":150,"unpackedSize":217971,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDEo/cx3VLn3rXqb/CovZp70t8MKqNfpKY8iQidUWSV2gIhAIEe9NwPSZCfJtIQ4Ya5a1wilbJf43ZjpNoJpkoawqDH"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmJ7UACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpNZhAAnqtUKvllCWRSSFhJaXKIlrYgomb1+DJtSG39xcklzbOPijR9\r\nvVhWrf+GvFQjhKjCHER/s+qEuWlvJnz0TTG5mhO8UyqSRTbh0rAb2oSvYIQn\r\nGjxunGrKld8ijQZIFkQA6Auv5RPEepUW+gBFXsj5HGqamNTOK9rdte7/zafM\r\nkOwIsNlac26h51atHvCgI3AWuZKKHK8PbVzkbiSwmHpDsH67LuXIfKeqEeey\r\nHiK/8Pz0HCJDGn1825VC4xXWibGlsxlB4pOZ4ejrSa5jnUa+iGFHiwFHgbBN\r\nRUWHNlYHtbKZHh+XJzxnbYDq2CdVdRELt4FHX/x1F4bI+gR56GEdmgXWevB2\r\nvxGnYfLfgLg4uvkTu99y4rU1j1dJxQUtwtySXt2IW5M55NIax0FqRChUwy4y\r\n1oaF1FtAVZHsxcNEAXBSTpWXgRJyfYvsEslGW1W6tmfZhNUXf4CdktSBKD26\r\nsUJk6ytIHCKNwYK4uA1zQl7KTE3bAdzS+EyObs+CafkWwGbA3U2uad7GZ/Av\r\n06cpzwosVLDrXmnAz2apkmYloQdTrwjlvHvyLFWvSIVg6IRamQNLgBKx8Uiw\r\nz6mx7vi/44pevl04+GJncJk/xpVLMFbakLJbeJkN8b6lx6gJ5746vZhvCMYk\r\nq3vzGbxOxIDHPohOXLBaRAQ2EGWoTHJotas=\r\n=x36q\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-pg_0.14.0-beta.4-a35bf74_1670946516762_0.4492862508081559"},"_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.4-502278b":{"name":"drizzle-orm-pg","version":"0.14.0-beta.4-502278b","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.0-beta.4-502278b","_integrity":"sha512-/IOas5hSHG0ADseNF7GK9nX+vDLDb7M+UJKxNnNDz/bQWxKSWw/NaVPX63/BfayRC7in7HqjFTNqNiUK4AnMRg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-/IOas5hSHG0ADseNF7GK9nX+vDLDb7M+UJKxNnNDz/bQWxKSWw/NaVPX63/BfayRC7in7HqjFTNqNiUK4AnMRg==","shasum":"19f42516460c88549354b3f3dbf5fb7393e4690a","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.0-beta.4-502278b.tgz","fileCount":150,"unpackedSize":217971,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIECW/o1qtUtKcSv8rwcx3i68KjnDh2vpHLGTTeVaQgfGAiBS4RzenVAbp43Uer8CpAv4Ssb8U+h7/5Um+6P8bqc2ig=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmbyaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqdvw/8CjxjfGz1ajloH2lcFApoGJRTVBUKUjuOHYLctQfi23BEFIt5\r\nac79cghaPhSZ1kvyDjOXDxOXL+PtxrahhG9wSajTZJkl7lGTtyEKGxKF6vaD\r\nulq1ZQo0oHkCCjYFvlVGg+dwE75+zLuV0YN1LPuBAe1h8pSoJcR5SQhQ92ar\r\n24OocwYU9RINUWMl4vcOoxoXhNHAtdjZ6xH8H0bcY1uaSL8wD9byKrAt1OVL\r\nGfVF+3g5R0nIRzTUljMhmNog8g+PyypUlPgfe/F++MYNAYKYuWtTLb/AnHoQ\r\n3v7mq1C9jVLS5QTaTKkVwV3hqKKjya8g2Rjs7nZkTpTK3IoKuCTTkdqveQQh\r\nldAo7v+GNaTZgPm/qRTWgOEqHg2sgdpB1axvejxnkxCKc/ldSvT35Ry9VQ+u\r\nGCwLdHURak7fZN5+oVp/aTkMSIs1+ZjfVNLAStJFKGt11v1YLjYeAWbIjy5j\r\nbegEiykqMKhnEHRV2mr0DeOiaJ+zRPXbtgaI7pK8ZUjurF+bqeQ/3VxorRci\r\nQ0mVukiDaQKFzn9Fd3qMuBhvHhRolWvGttCjTtrATEjLZgkVKGW6R99VPNiO\r\n1i8qxMRt65R+37bBWgL2HGjHuTBimEDUk7L9/1Sew2aniAW5JLUebVlfe06Q\r\nIn3oQtXfTGutI4WNSBlYTgr415jIP77jYZg=\r\n=xxK2\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-pg_0.14.0-beta.4-502278b_1671019674127_0.9537876512566597"},"_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.4-efa4dda":{"name":"drizzle-orm-pg","version":"0.13.4-efa4dda","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n#### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n#### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-efa4dda","_integrity":"sha512-i/ZNJ9WhEntWgVC+lp6eqJsUEJsC9o2PkWqFOaGg+e9/bZj0XTzlFN6DaoBipLNhxgZLYpUw+/hN0WesJWm4Cg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-i/ZNJ9WhEntWgVC+lp6eqJsUEJsC9o2PkWqFOaGg+e9/bZj0XTzlFN6DaoBipLNhxgZLYpUw+/hN0WesJWm4Cg==","shasum":"9f8e6dca387cdfff57e8240814ba66f60854ebd6","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-efa4dda.tgz","fileCount":150,"unpackedSize":224358,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDPEGXH1eZXvxI+ppELfoH2WjlMjaXG6xYM+VucIOO6IAiAw92yO1BqQFh77A28K25DSxwvF2u1R/JoM2ZFzmuchjQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmwkJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq2AQ/8Da3cvCGVFtnF582btNBVKzb+3iDiFYgq71g+mnme3z65aVRi\r\nBu3uO19oO0DmeioIsuBVBlc15i3v9WqUX9XtT4yBVQKl5k4Q+pOs99EA4WUz\r\njBodq8Xg23f5gzFWrEtuiMuFTTX5vnfNfV+lfOpAdhJHeWYFcfW00ckFFryn\r\n65Geqhq8/XuuEuNEmdNqh48mGmiiABZI2Y0BBJNvn8aMJUjW9Kb8JpiE/t1N\r\nKXyo67C7mpKlx0QiPe65SHc/HH0eR/nRsHk9tBtoSeQxrqQYdZDdiPmzgShb\r\nUPEvRZp+SWZiePIDnFzADRmQR6gJkBIcN3UItFRRKMGlQslVumG1qoWPJofb\r\npy6tlvjrQ4rvkwh3wyXw0NqdMU0LSQZn37NJ8VHFRsrb3Q+s2XIun0Z+xoNq\r\nhMzm7seJGgaIkUrp3yOjNus3luHO0JfztdEpZHiOmtu1QODcB8PFn9BvCpiN\r\n3MNzm00ouKopuOTldGxFp45OTSwlATVvGnBICMUOZVT9FMHoP8AVAyXKNf35\r\no8Iti/RgtgxD+q62pZjFiPZcz/bK+aqXuBdhebeoyHaoiM+Ac803fI5VIayn\r\no/Rny8253Ibq26fD9OPGKMZY5BvNwF4LUTrJCp1YWpmwkQtPu5Q9meVAWcS2\r\nCwMwK9D24hUIEg2hNt0WLAzhO2RupMWC6Vw=\r\n=NMBH\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-pg_0.13.4-efa4dda_1671104777242_0.34261478388172883"},"_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.4-f115120":{"name":"drizzle-orm-pg","version":"0.13.4-f115120","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n#### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n#### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-f115120","_integrity":"sha512-E0HifuVsoQolv7Lt0s94Cc7W+gYOwU/toFfVogxDPnEAmgs+65bHd3YE7Y4uDJ8ZP2MscMrdtlc1Z6nJhY2q6w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-E0HifuVsoQolv7Lt0s94Cc7W+gYOwU/toFfVogxDPnEAmgs+65bHd3YE7Y4uDJ8ZP2MscMrdtlc1Z6nJhY2q6w==","shasum":"c5c68b50a5b291f64b9d689a6e795cf702f9652c","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-f115120.tgz","fileCount":150,"unpackedSize":224359,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCrxdbXPp950SNHdFDDIGNgFrPzyQ2MMlUtbR31AA62AgIhANu5y15Sntj6Gb3BJqOSBvaHP6JxI3NVeENUoSjV931+"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmwocACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqEQQ/9GEuBWWgZiMDt1Cs2RYFrcCm4az+HEZ0DVs5zqaVFGhttEk9w\r\nImxSYkqo9m9r5V0ABcpFM8x5luPOVuYMDaqImJgd55kgZmGj//bw8snvXO+t\r\niCCJXo8S5d4QVUEpsVpQFlsJoayAj+QHR21kLrUtFDKEI71Q8DVTH06BXMEm\r\n3kvNW6KQrHvQic6f0RobrxhTynOsBW7QHIoM6cjYsoca3BhwMIIQTtanHiXz\r\nD5YbGSTQjnbMnBR4hhnX+T4nBpi9cCyRXcZt1Xj5rworl9fxcvEG1eFJ9PC1\r\nHoC/cEgbiBxr9sYKZ/0I60KuNUgCEhJmcWxsbX9XpNUN1nvf/HRJqMyhcLnZ\r\nCYxerFvoDilQsLzhVNfACV6plAsO5gmYRqskFNwG9aCJ2q8YHTAhmFXpjQzt\r\nQAWUgk19l4aE0HpUMkRIHonJOX2vANAfNspCCNYCLwleorPcrPTkuixgs0T7\r\njHHtcSohYb9V8JDTWnp5fY+NzJv1itRLoH2VmFxrFvgEXf4aRxD9ET8SrQtR\r\n9hJqXAHsZum8o408i9MyB8AHnUVq79bPsgQMr0WdScK6iYY/jEBv6/VV0TVi\r\nARAijq+8q67UnTi7W9kXeRZNh3yMaxV9bZZazXdh4yr/nQBXxxccaKrtbX/C\r\nSt20mqwTVF/VfD9TjRf6hpT/Emtwu+O38nQ=\r\n=GA7c\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-pg_0.13.4-f115120_1671105051865_0.642721221171209"},"_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.4-03f651b":{"name":"drizzle-orm-pg","version":"0.13.4-03f651b","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-03f651b","_integrity":"sha512-28Xr4TdgcO7H2C2eq7hcisW+f0sKS1JpLg0km9/6a9s/B2XFwrs1Ie71mhcm01i1NW9HuRgeN5vcbfkWxRSiPQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-28Xr4TdgcO7H2C2eq7hcisW+f0sKS1JpLg0km9/6a9s/B2XFwrs1Ie71mhcm01i1NW9HuRgeN5vcbfkWxRSiPQ==","shasum":"b6cb7b85351dd79b34dbea5cb5daa22599bfb3e1","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-03f651b.tgz","fileCount":150,"unpackedSize":224357,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJxvLzx+V5kxykchqfm+DP+E3OuBPqS364+GLpnAeExAIhAK0ybBbg6/85UT2i/Kr2AQOR1Zo/1ZTZlNh6T2OptK1K"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmwwGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrFqw/+PE8k9mK2SibNC/F+ZuB/foeZuRbMFmw0CxZ1HWURrAiGdcWX\r\nMMN1mMPMw4RIKXC7AYY8Ma/Jaj4X6yUWicQF8i3ieKMnkJlaFKtpPCPM0FfR\r\n8RZgNkRhU1IHl/h4oi+wG293d3pBTVpFyCj1VAgSRl6fVZOVwNHkhq+ylW0d\r\nKWfzNizytscG7jTkdXDuPLadA9A8JdgiCTunw480Pz6kGcJJ9LFZFXQbqn1S\r\nPchyJ2V9TwCQyNDqFNzc+8iTKxEF7WtTz6D5V1Rmd37AaaCRFIm7QSxsrqIt\r\nI1aEBOelYp5sNCaf9QEm8Eit/UfIkqQBG/+OuX7WyD0YlubyC0XYZ/NSKsVW\r\n5YHYKSTjaohcVSdfJdyjVfXTYFaboH/Ls2CeU/nMdz+DBf/ND4xrsiIpaOMZ\r\nCK+siTxh/xl+kxDBkD+0oTUmo7/3VK23BLUN1EukgtL7ZSsO8b6wifaNFpB/\r\nn+4Hrjb7nGxRvUOaeuUAI/1JS2ODZdMoKuleYarxxQtd4ozkfmI0t8ToG0XA\r\nznEit8NcOn2KNY2r2c4cOHv4Ovxm6KqkG/RBUyTJzLEoveZVR3HAGOfGB1Ka\r\n4XWTQZTIssQkRYLJVGVzWVS74Hw4qTe6gvInI+l+5rp7ra5AMpZsST5vnKbv\r\nT5cpDcDSbEoK4Dr0Bvt3LWcS8MED6wGaNUA=\r\n=WIZh\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-pg_0.13.4-03f651b_1671105542738_0.48014270815137783"},"_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-pg","version":"0.14.1","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.14.1","_integrity":"sha512-+r5Mbbupt58UgOYd06GrprH3rhprHuYkiyoycTIyLWHd1yGoR4dTd9wuQ3T2eFvNaktayNW4EyzBxPTZX3ALpg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-+r5Mbbupt58UgOYd06GrprH3rhprHuYkiyoycTIyLWHd1yGoR4dTd9wuQ3T2eFvNaktayNW4EyzBxPTZX3ALpg==","shasum":"d5864370b7eb441a8a3dbea00d0ad44c67bfb7fa","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.1.tgz","fileCount":150,"unpackedSize":219142,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEatOAosHSvKZLDD4x3uFf6QTjnYw7HfKQgMltJJ4K7EAiBnnlK9OC+NrrXO98WXqnb81XQKCbcuwKI+HtTYGnvo7Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmyoKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqD8BAAg0qDyDuNCvcFQ+aK8kjn6CYoiAQ8i+hY9BbN+rix4LmWqdyS\r\nNz4Aj3IVhU7rXyNN2+bjMSyIoMoo6sj89yr4Z5PegrE4bTLuxenTE7ZQoJ+D\r\nY038N5/aCSH/BzOleUE7MVPLVtTelCRLlVGWewFhx6+lNnTXEqtvbiNGRyGh\r\nAp0EHcuGRo4ZZPsjH/3M7HOtBEyICDIliTdwWYoRHbMAhqpm0onNtm3gnh1L\r\n6kXMpbIaELzLWQviBND5F11q0BNq19ysWqZlcLC5GP4EbHJisSUEmz83eNYb\r\nJ41e7OXKNtUeRPh/NxeJuOkbDE0Yzq78KDlAdUzS4qbzmqnMCAKHddoNURq5\r\nU8MD5vuJcHZUl8y2NEX3UZfw2hredRXPfhpW+SX3zsRhlCErnHVoqMUb7Jpv\r\ngELhsTyzOXDEENS91k/3iIK/9d1ueBHvu4zXuLvTiWn0uW3X+u/CY8Q/wyTt\r\nJaJzZ7r3CngdbJGRWLn/HlgoEDCqnyxXlN4iTVEvn0Fey1VoS9V7eiJ0v70l\r\noah+RfMwGgWyPmkoBA6UvVqR2n/gvx5CkAZs/uhedN4W6LexPWIsWkx2bld1\r\nxKSwA44g7RcX7TwgFo4zDrBOX9oO2gkaM+p8osXXvtUFfFKA/8BuChIhsM2z\r\nbHRcAFRKbP48bP7mKWDKeBE+zE6bt5Koffw=\r\n=A2HR\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-pg_0.14.1_1671113226779_0.027652354028791626"},"_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-pg","version":"0.14.1-bad61c5","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.1-bad61c5","_integrity":"sha512-a0NsitQ6XjqBe/n8vmORJ/bc3Ms+eQQ03uefEQVoB5HS2oBQFyu1J3KwPjbnXgRbP3aupFG5/CJO5ps5VxtkwA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-a0NsitQ6XjqBe/n8vmORJ/bc3Ms+eQQ03uefEQVoB5HS2oBQFyu1J3KwPjbnXgRbP3aupFG5/CJO5ps5VxtkwA==","shasum":"5164e06289210beb96de1ede5030633dfe6a9f72","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.1-bad61c5.tgz","fileCount":150,"unpackedSize":219980,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7a1XumnVumuRAiJzAtvMxg2DldJ0amdx3nBY9oOQa7gIgU7KeF7hxFHrZVrihFlTKCBkx6EdgN7U7M/P4q7Jj92c="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmzTmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp5tw//bXrsaRRn7H5zcvIWTLxe7z9NsuzsOTt3TYd0HW6uq90zQRZw\r\nbtomMtoUzLCgeL1EtIw2KeWQktjWHdK7DCI7oB9RKX3vOXqOgV75kBB0BeEL\r\nCWHk8SR4Y842zE7oAciWKSRB9u2/zaoDBHasSIgZF/GgAEp4hE4E+Jz2hhVJ\r\nqKNZf+Lbia+qLbmlrrsVXak+NAoDWSjJV9eR8U8inADcoaX6ep4qULtn0oyN\r\nxmSGClytgc7wqvHQ1oQ9eKxkmHsrHctkg2rAdoM5HDhx9sRdupzTc+MlqTws\r\naZIUAWIzPuZvf40Xo+i9vtTB8STPiMO1SGVtxGtfHGz5TRBG2n3NFSQkzvBZ\r\nHYlm3mvuHlJiwNFr3De2JwS4hR7km1RxZLtOFcWk3C8RUJiImd3GNdnbWteh\r\naWdOTbVYzUwCTrRXZrVZ8MgpJFLth4HOeo96wDJZRgcE72MirmC8bVINSQ37\r\nfr7RWKpc5yfOaln3FYrEJ9gSqc69hszKAeHY9DT8VANjoO/axyxr0uEPTKAZ\r\nsUw7Kh+Gkyd7/pKptTvD4xiHrfNZ5gvDQ70FM/cXaJLqqb53XboFVOkhhuuA\r\nfnqL7CnVQeyrktClHm2OH4wI+WKRbeYhYk7rKqmliZ4FelT/xg5zdgyttl2m\r\nLcnD89ur7WK3vlBkfW0tuWNcCFzbQlVQzaw=\r\n=1EqH\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-pg_0.14.1-bad61c5_1671116006288_0.903995421067072"},"_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-pg","version":"0.14.1-f92529c","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.1-f92529c","_integrity":"sha512-lyTxWLCFJgwJ9DiZ3wSscEl1qUDPF353HQn1sw3cHzGZCaNpcQqO0MC1Nb2vsQ9ZqcIDWF4V4IqyDUq53MOxDw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-lyTxWLCFJgwJ9DiZ3wSscEl1qUDPF353HQn1sw3cHzGZCaNpcQqO0MC1Nb2vsQ9ZqcIDWF4V4IqyDUq53MOxDw==","shasum":"4a444360ac7cc71e0df23927de83fa9d50204fe1","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.1-f92529c.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDsI0wIfdOwAAKwYwdtb5n5/hUBV/7PVzSezHNuRILcoAiEAskiaB/jhQWDBKLu44BUGghNOPMj31xIlKVf7yBHYSnk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmzWHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmokjg/9HWHWYcmd6yCTIekA3tpsFgrY1JkNSR9sOifZ5SpLVauNJ7Sh\r\nERwoR0N+3SLmYZGcvHJd1bZqNGuhcPA8W9+HASb9LY3XxvbnfXkQjetzVbGq\r\n/xRzMW1N6mlgQG6sU2wdmD1za9kroLjDFxTMDUHfuRDiTXw8mXVv+VEOmTUy\r\nDqE8oSXv1Vlq5ILMjw1bcZssJETRXswHc2fHrRd9YS6XmtwfeqooMvXHrHbw\r\nxNMwrLYNAnf05FTW31qIGBDIeHRd5em58IR/fuytw3/GKSZwMbKPsTxAYxiV\r\nSYx5KvMHpv9DUmrsF41xN/lxmkMNwMVXCHv86u9jQq39DXtVyXHrbP7cZKML\r\n/ItlC98F9zWJIbtzLqhA9asPTUJpp7nNv8RcaT5eVEXwThhECo/UMtiDWbIC\r\n8Or+ed5lmU8rqNQrtPYV0IXjTHE5Sr/DMLkzBMVQ6LeY/7ysP9FYwBbS3Hwc\r\n0UxKHR13xIPl12HIKWhXfdaPT5l+XZPsfviBShGGDKjaRHFXxBzqwzVx9RXl\r\n80D2U2xP14xC43npRM+7QfX3cZCiO/TmzEoIHuFN/6BTr5AdKQmfH1AVqPrN\r\nJRWobA3ct1AwV5G90LjDXVk2Tp1ZizEvq6U2DGFKsuDwHAGxda1IkLBQIizf\r\n/CumhXDV/m3z5xNmOIIveKh8X9f9BAs9xFY=\r\n=sPOD\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-pg_0.14.1-f92529c_1671116167507_0.5620230574462142"},"_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-pg","version":"0.14.1-7d1d823","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.1-7d1d823","_integrity":"sha512-nlgxupQjBrfmksc+eg34L9TirnjRJicMhoBdU/JgENx0kHZbivB9vH+IKc79tjypnbXeJVzYvYaygKCz/vVzeQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-nlgxupQjBrfmksc+eg34L9TirnjRJicMhoBdU/JgENx0kHZbivB9vH+IKc79tjypnbXeJVzYvYaygKCz/vVzeQ==","shasum":"d022b593b998dd6275350ae264e4d4388ebebe38","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.1-7d1d823.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGy2X/gX9yXwgqt9gqFMxOlzVdmxrKNX2VnxhZ6dEMpAIhANuk54Iry+jffiZk6vv6w+p4SEtiQYA9cBMaIEneelBA"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmzbwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo3lQ//Tg0dhlpkIwgkhgm0OEqYhj2Yugqv63OYxmfumO1G9XsBRsJQ\r\n4ju67bLBrrKv7eT46OZN9EdvLVbGTtbvWIhGZ7fhd71kaIQaKGWLtoOR+MWg\r\nOmlYpp9AdHxQWTFOg2Z5dGxGeGql7AiHSSUSnCvntaA1OLnxeSUhoFwz6BCn\r\nRObvDB2k6KwGCcEBefLOntkbnKbDwrplfHMOQj8CLMCjra6tv2rk2isiRjgT\r\n4C6LfNG+96As3ikQvFo3p4MsUfMNRJlpRgOSW9fIUxrdyv+VLUHR2HktrqLw\r\ny8q8Zo9T8fLO9Of/zukCJ/t7vH3yMtD90ovugVG9vBC0q2zMoaSX6pASI2sr\r\nowbmNxTNF/dxOM6V56/VqQcERTIcVacQKQJmhL5qRUM7G4Is94UpqhZoyM1z\r\n448bBWkDfoTb39i1vC+YiUErwfoQXqYtcE6psrYumYXpX96vNIbcNV01zCK/\r\n3lw2BymdBVOPdkdpLgLd8OOHozRo4wZ8LH/BOiskR1c7989ueKM+f0rxJy+G\r\nHq/cCM0JtI6kq+tMjO/YF5JAm83B3qGxXqG5pqCcsLrXfMLRqYHK62fMv7yy\r\nrHr+7lWTSkMEaYNFDp8K7NV3gP7SIjQifRo+U8/pQ9VZwl8FLZdTquyQIdQw\r\n7WDJjkp12bj9qLQ3bZTb5TuyNN/gE48PavA=\r\n=Qo6f\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-pg_0.14.1-7d1d823_1671116528324_0.04038393523003858"},"_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-pg","version":"0.14.1-1f44b00","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.1-1f44b00","_integrity":"sha512-qJZ4uqaIulAkGpBng9UA/r/PIHthaORVZpE+sZJpBZOdHMHpEhu17TlYPs4pAo+9PGk0gnXu1zA/wKqoTjMFyA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-qJZ4uqaIulAkGpBng9UA/r/PIHthaORVZpE+sZJpBZOdHMHpEhu17TlYPs4pAo+9PGk0gnXu1zA/wKqoTjMFyA==","shasum":"e97c13e1cb0fc6af2ec24628f653d281d741b30f","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.1-1f44b00.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCPgf290RqTUUCSjAaOnp+LBGPr6P0kbn4JPFsmhQAbcQIgRvtwQsqVQwF4s3rdegWNd3ZK5BQvUhaUfc38mGxQgY0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjm6AMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoAHg/9FvUlQFRvN7/dO8rLF7sWZx24fFNwjZgsrXjQxFh4sTh4I+F/\r\nyvbARBNXE9vSXd2bqZfImPd25jvcQSL8p9scv+V1v7Je4mBUUCUuuPmBiJke\r\n1s+8JtrZY+oO6E4njDGby9YUXLnd26222XXoRFrpBrp+HcTGYqRdX7CUK0rw\r\nxfeWFlfReJrY9b6MZ4ADnIy/llBEEihusB/wTLXI827+Uvyxah1PClmypvqW\r\naSGP0B0BysO133vOsjOtMcftPiGnW7xuUN7fgySUaShEWz5eYwrvx9ze2A7a\r\njNNsMZb2vjZOCfaJPQGPD3hVTPZjzp/l2z1AquRxyCkVCSImuMUwO7MXk0gW\r\nfoHbPulS0AEVNfy0DgTL3q2uQCjpR+fMARSXvxqG6J94NBEDHa15FlM2cset\r\nhmOPMxDiAfY7cNwTPknV6q9UbIstd0VztH9Y18lur3Va86dgCHSCg34xmRpC\r\nMvgzhFwbCKV39zkdcbCDZSAnfrgchNCdeTQjgKXcfaQD1GOhUhmF3JJvCArv\r\ns75af7Y7J4ilq/HPIAyR86dgPDLo1rdzbuhaoyceEGrlHT1aTzbhC6183n32\r\nh0ulk6loUZJ4I8Fs/k3efPIZ+HDezIHI3ZxSNrqJeN3wPztR39oQ6Ivpd+Ph\r\npafSuhMTvh2jTIBb/IzaQYRe8IUkpXqVSAU=\r\n=YseZ\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-pg_0.14.1-1f44b00_1671143436086_0.5091189383074033"},"_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-pg","version":"0.14.1-1c58471","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.1-1c58471","_integrity":"sha512-G//pAb7WG7ouNP0TyUwV0DWBvqOMm2D4UD57VFG2NeYMtsUhRd76NzIFHaoV+iMV2e7P5FqCzlv/1Deuf9Yllw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-G//pAb7WG7ouNP0TyUwV0DWBvqOMm2D4UD57VFG2NeYMtsUhRd76NzIFHaoV+iMV2e7P5FqCzlv/1Deuf9Yllw==","shasum":"3f354274912107a3282817da145220df76fbc5ed","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.1-1c58471.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDVfSF/3jMaGWlLfVvcJMmMzltKFuH2DtCDnUicM+PbrAiEAo+JYEUmX4DzqrRqwyBgU4lol6y6S38MyeC9009c7sZ0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjm6CCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq4Vw/8CBXqH0xWVHLNIzxQhynBpmeR5UihJR2tiKCnpIftDp7+XXO+\r\np+RF2gpskIicda6JJA5ir+YoHyavcG54E3z7h68eAZqkPUCVIBBsYOZDHuds\r\n5FBLZnhpT0qd8sfjPCfoUCVPl0/Lk+qbnkUdzk6mLTiX5+Dc3affbLxw+Fs5\r\n1pTgORKp6VDmzO7HLNDqga2Ujh/YbdLWpVbCYXq+gJgsXH59KoxJiusnpo+A\r\nnxCqg4b7Dc8fMd4fW4bgLn1yHBTYvf3BUkzTub9lTvmes7xGFfAngsVe0yUB\r\n5gq1sAXs7Q46rpEtfxInRofCS5q0pwgxC8plLQRKgba1cViw5+Y8l6p0SVKg\r\nrZ15nFUWejCe6BXK8cOBQqN+F9EZe4w8nUDvyARpgzghxaiVOJtE1aLKSZ85\r\nGn1nF3YyPyerVXLMgFv63FrHBI61jR+Rn7mkwH41FXsHcwYg81s3OdntHGu6\r\nYVjUZ2LjYt4puq8JkTvlvl5Mk8e9lK4RAhUX+3LD5oxFbK1B/ztEbmWAOHZc\r\nfyJdSyNBTWw/9ZgNnfe/1fPob03CZ0vpakQ34v1gDJExArRKn1GhKfasnOcQ\r\nWcBaxkxqylkAdcltAFTlP0WTm6S4Fe/8i1x8wrLcEZCS4ddQEuTi+bh2DPzC\r\nLwNOigxnGf3XG3A5jUhwCsUNCHijZeBM/YQ=\r\n=/9tV\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-pg_0.14.1-1c58471_1671143554396_0.5127216654548796"},"_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-pg","version":"0.14.1-1d98f11","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.1-1d98f11","_integrity":"sha512-Cx6dVYSJdW+Jmu9dQmQas66epSYZg3uMgdwKH38+G8a3rhIr5ZYChN0Pzu5M94M3KgQItqIfu5uFtVBM2cnLHg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Cx6dVYSJdW+Jmu9dQmQas66epSYZg3uMgdwKH38+G8a3rhIr5ZYChN0Pzu5M94M3KgQItqIfu5uFtVBM2cnLHg==","shasum":"cc0737ee542555ab5305cae68dc080fbac92d8c4","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.1-1d98f11.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCjtCUyIGW6lwWpyDUnxmvNysU+sFKv7c1FkknF6khnowIhAL7AjQqoYwBmxX0Ynq3PymUaI/07GeY+8ABl+9kYxY6l"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjm6DeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpNNw//VOG4qQjApuCaSqBJv6u2W2VU0LIkP0iqEmMLnEHgNeWCpA6m\r\naF26PkbFrQB//UejpPZ1ufmxgBRVeOLa/vv6OXJd7XaGDypdJdtQK0lqdwf0\r\nLHku/5JlkYuBa3+mj4i/jZX71BbTcbQq0ZwHDbaJQwZQdeqVovGEkUtpjnk1\r\nvNu8YZB0O+1hJ9wdVBkToOHQYBioAt0TQeTWNMtKWrQBilM+4gzBNAqvOUZZ\r\nnpaWxzqLzyEIxHXmQCWjsGr7czYEbb2/0GqBM70AIgUuPE2rcKDhyb123LFY\r\n4PJVhan3SgVmhigZNtkch1oLj+fkOgjgSaIlnNzRX3K2wQw2Rk5XjJowY7C6\r\n1EyLn7xUkR3snpl3WVp9SaeBmgc/SKT21qEloHafSlmNeWG3H2n+xm0LaWOb\r\ntekLF9lQhrx4MBNMrO5GH1ZqKW9rOZKUtr3PohJ7hyp1Ae2GMMII3Lkd7Xn3\r\n/cDvaHPnEUBedhNsnXgwv833VtEMcnRM5mbTOmfAIwoT6BXwK6h8sqQHo3Dm\r\n7H9BI4Bhk3buA+BQCBIHPqAVxVPrzG7zdYDszSRv0ilio9GyXMkmTrCV+xvn\r\nW6vCTwPlns+oI7BlIw4n6AtJGs7n1JImuWTGqMfhvT5bWx/dKXqREBF6UZYN\r\n86kiXZFK4qRixra2rrH0IdWvVwX3lpuJz7Y=\r\n=+3XD\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-pg_0.14.1-1d98f11_1671143646465_0.3257795730891755"},"_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-pg","version":"0.14.1-f617bb6","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.1-f617bb6","_integrity":"sha512-pIObvpb8n5wcZkBnV8hgrowVYSJ2XUBX7IBSev9wa/OwvIdkeMDsgtT2NEaEjzeMWeW14A71UjHqRlU/jZ16Zw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-pIObvpb8n5wcZkBnV8hgrowVYSJ2XUBX7IBSev9wa/OwvIdkeMDsgtT2NEaEjzeMWeW14A71UjHqRlU/jZ16Zw==","shasum":"41e060cb2680afdcf5aab3812bb40819dc5c3aca","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.1-f617bb6.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEPKbPCFT0/mmS6oZg8Zw2NB/nwvB+0bn24/IC1CPmTAAiAIfdst4C2W9UZmkZLABJJx+R1JsyEn/ysosPfLhPmKUA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnExtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp+Wg//UbicaxLOXvvfAmVF6R5+44Ho3HgZmnPGn3dTb4s6S2nOHtgk\r\nNyauMDWFoE+p2PyG+5kcfd9P90SML/S1ZAPrczZiBdrEWkfzigQ3RlVMyssr\r\nMXLKSxLf4wNsbrz+3h7fOdqGAIraRGx2cjPF7bXKGdqg3ACtUWDmKBikH21V\r\neDKIuxHvhS3tVTFBdk8XIuUwuHFH5YAxnwp5s5aUnmkNdj25qfoiUlwqSMrT\r\nZADC8abtsutAvwM4H1MhNDmSBdlvdkeboUGIXeLwpGwxGU9Ooeu+z6aIZdbf\r\nBnbY76PRr6idsyl5kDgRFCE2G9hIfwk8AMXx/GYxo33dEYQZgLK5BvbyobbV\r\n6PO8gVEkCSNHdT72GwPZHLlVBvTJxxLBn1k2xPrMS73fMs5Ccbu9gsoc3jFA\r\nVVvlRiCei3V4QhsL1dGqcwCvXz8ziPCpIfjlzHW1smKUsnB/DC1hKlZvOXuB\r\ncNOjksnV+c5Ku1ntUxylgHZd8oKx1NBZy5Oo1xjRIkmcMoxXRc3Vy0elQ2YO\r\nntBP5HJviKWZ++0DcXgLG2YeNtiaLj5Ec0Q7YdkgUAh4gDVYQ58cC3iyK3xE\r\n8Do0zQtmkMadvoCxWaLeswHu04O3DZdUJC3AIK+BiNKiFS8l5CCouQ5MZqTT\r\nGIqvXCYEU2cqehOBTr8H8SncidgqTBNYKZQ=\r\n=RJ4f\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-pg_0.14.1-f617bb6_1671187564820_0.5941966748676744"},"_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-pg","version":"0.14.1-c5dca58","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.1-c5dca58","_integrity":"sha512-Ig7oAItEGQh/AGl3lhk19GtVPsNS9u6WaTkbvAdCQrEzADU0zWDW9uLQaVZXt66HmW+GJ6yzeTgWAQvGIKQLvA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Ig7oAItEGQh/AGl3lhk19GtVPsNS9u6WaTkbvAdCQrEzADU0zWDW9uLQaVZXt66HmW+GJ6yzeTgWAQvGIKQLvA==","shasum":"52013456d710d5d5e37d14d53d64f729f8bb824f","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.1-c5dca58.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2FvbzwXG4oUDfmSyDCjeMwiya6ulgyrM3x0Q2YlBZAwIgdr+POElmO9su3WX2OhvYgNnCpCoXIpK1v607+5tFmLs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnE/QACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqfrhAAgYon+XzQSP+5HRo4jF6c2cZQQhRSMMmIRNi1hS/kL+gJ40TX\r\nQl/Vomw4pu+3PZW+vXqPo5lKIUIR+DoH61jdipk8UPrbC9mk2S1w2hVdXr9s\r\n0LGvJdRvdSWfgx6Fmh5nTcGBsmNTrrXqhMMP6amAzogiEKSZtmiBJVpxFChz\r\nWa7pln9aUUnW6JXXZo6CWwMdzylrqr4cU+LXTdSzynibrwaucGqeI/Mxn3L9\r\nBfMJEHgSFJqTbKDU2l2LwvkZtU1p/E23QVS75WhnVH88CcHD4zg9zP276a5K\r\nFJ3ovZMwRjemTJebj0VuqBJRTupYkcBb2q1AFgj3C25m6+kkPxohw4ltnnTG\r\nI4xIkJ/y0VYNbKrptBy1nrCR0lrsVHlk3N37Ruigkc11bDEKRIRWL9fIRiMk\r\nca0PaCcbUcVOtY/70TP9z5OqGk9V7nlFBWsiMkCeFhpj7E6QYUOo4gRSJoTa\r\n/KPwr/P51xUPz9deI0IGGi1kkjJondqdiNYVS7cdIuaox5bYcSjpbvMSZ9sm\r\niOURPQGxSTI0tOW5QgySGK8JBkKhrJFpFyTpTevw+qsh1OD7w+DTQs/axi/U\r\nm+W227tCr+1mCQT/YPgW1mEuoOSG2JH8gbV6Mhwo+xDTrnck+tOm+D4xnxTu\r\n6uR24FQ1YX6phkLX89qWVJRImzkeTuXo3QQ=\r\n=v/Ku\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-pg_0.14.1-c5dca58_1671188432639_0.36371117618215076"},"_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-pg","version":"0.14.2-3793d78","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.2-3793d78","_integrity":"sha512-RFz+3Z4HWSpcgeBhhRb34OOTvgWQ2FGjnhdUPFWfwvtvxsrF+0ff+O/YKlfxuBIqsRvffUBXnGVxqt8Rabizdw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-RFz+3Z4HWSpcgeBhhRb34OOTvgWQ2FGjnhdUPFWfwvtvxsrF+0ff+O/YKlfxuBIqsRvffUBXnGVxqt8Rabizdw==","shasum":"5cccea9a11b7d1a5e9283da5949aedeecf014dee","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.2-3793d78.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICq684knaohA9BahB1YEMIeiGMnI7kEBrhZ3pyhAtOjVAiEAkSqM5YXaXq8W83for00s/pdDsSqmXy2j56z34eOOzqU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnFONACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqYBA/+OlDL0oAUbhNIX2rTrQSwsQAsGE7K2ADMRlWDRjzUdwIEMyb8\r\n95edwT+YNmcMI9NCOvhc+AESjJ4R24q8yzCfRSWQIVxejqHWgZ4/qWGTQLRU\r\nO9omPG6UtSnN//rJxR0dIqiCCZxsufw0fbaLhJOg0PT2wRa0zqARIk1TaZwC\r\nymNhaLBmHLVX/qo92W4xaljg6lUoQsX0LQEkncSnbBUtneOrjsDGHcAblsH4\r\n30bzUT1SQVW+YEg8O4Wn7ZtD9bpq5OXKNtKyBbawUsoJZ+UqhBe7vFnEQzKW\r\n9FWvM9OSBXaUGQCKLfW553G6j/1pSrhrSEB704f4fpE5xkUB2vKL1a3fUlO9\r\nHn3VxuTqkJrT+0NAaAkBNcLS9/z20w23aJTKGYCHswUR4fIP44M/Y5YP9ub4\r\nbdyXJNAU0KtaJonw4EaKVWdvg98fLmCS+/xZYBF1ju4iHsDKctgEa9rZ76q+\r\n3cF1V79lmK0EPa9ztutuUDCbKzGxPDhqMQG32GdnhpEN3HUFwFaYTWfRixGw\r\nsTvYQaUAYiFxPq2SuMWyDrW/38sGIdhPz+7yNj9ZsLYnkgBF7taqhJGSzxGT\r\ndIqHLG1dtHUs6VmGkU1UbQ1IXwPDhuuczQAImFXTqiUgu55VGvqA7OXDab9d\r\n1t28J2X+loyK4cdJ6Ehs2F5ly3JXlafSC+E=\r\n=mXAI\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-pg_0.14.2-3793d78_1671189389773_0.08466967745456744"},"_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-pg","version":"0.14.2","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.14.2","_integrity":"sha512-GDaOX9MO2d7vENQ5TM+lvXbm02NIqwLXCyfL8nFDBIZzLmMwLsdW5zmTKqMvT4/d2+bnevHofbsBGDToQZbxng==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-GDaOX9MO2d7vENQ5TM+lvXbm02NIqwLXCyfL8nFDBIZzLmMwLsdW5zmTKqMvT4/d2+bnevHofbsBGDToQZbxng==","shasum":"922d42746d0bdc49f227f3281c3f8ffedb9b7cc2","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.2.tgz","fileCount":150,"unpackedSize":220341,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCrH5Qv22VCyCO03NIi/DGFCXq+ST7gSwCGRn2vsR5IIQIhAMboaJlqK+trGIdFgIWRUsZyohPxxmlWNIszLZ9JdAt5"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnFQvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqA6A/9Fow/+d1UCzuZFMNqa6okwjVsMEksG2zailTIOXdBjEiG5qsq\r\nX9RDAX9F8UpJoUXn6zhAHvbsaJX3nu4Hv3jCZd6xMtQ+cZPUggjkkxLTbdxq\r\nqnNqOw7u1tSnbUPGwPJGnQx5Mf/V5qCZ+9hGnmafeKrA8gcqBF8slnP9fhnJ\r\n3ltmgh/AtsHip1hkbijScDVTQu8Cz+JaP7saWnM+rmU8cHKFwr46S423Ta21\r\nx6YIiZbuL2IeIodIrtDoyKMK3DsDjxMWZp9jY0b/zuIbiOa28DWSPk6+49kk\r\nfQsC19Oly7V6LJmniJP96O+zknVvnjezVmkkBvQ6Rc84gQdtkGifjOPGA/9/\r\nDTlHXZFbhE+DOeq4MiPYs7jO8mzq+JJlh5tXzK0VKBw2zs5R9nansYK1MymY\r\nRknMXp97Y2jsIvYpQnkneUdL1RS4FfdVptYJs0OcXE5z+QFWtm0GOInFDXZK\r\naDq6EOwo0Lm9VlRKzHL7a6mpmT5s1IAjrawuLlQdYz31uHMB/pjcCxuv5XBS\r\npSX/EjC+huS8zwyoFo2B4Vhh6ZG+ZksWNiC4Q5CgTB/9YLblsOlAgd2Ac0Pv\r\n/A8XsZdN1fYJ47sF0e8adKymE34XLwkiFgsSQiMoD4hFoTggLIhoyfTKKYWm\r\ncVK37TA5A2qh6+PQiVsQUM9QrM43SafLZWQ=\r\n=pR2Z\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-pg_0.14.2_1671189550791_0.2508601154415919"},"_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-pg","version":"0.14.2-3967f06","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.2-3967f06","_integrity":"sha512-44F6a2PrZvFeVFL4GDjJ2BTs80tsG6VK38Y/kVyXB6vzZWT9spsMkB0pQBDzjE39v4qEpRxI2aihPGRM+QldGg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-44F6a2PrZvFeVFL4GDjJ2BTs80tsG6VK38Y/kVyXB6vzZWT9spsMkB0pQBDzjE39v4qEpRxI2aihPGRM+QldGg==","shasum":"d7081bb7ec7e83e246e7dc224267ed5b73a167c2","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.2-3967f06.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG0lUJUXlsNx/FlpPV+uVog/2f5iz5cFHZkwCSgq7VPRAiBm5QIWvKDjj/0cax2kqhXMdXvrw+ZY9OGv4uYR6+9XTQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnFTaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmojkw/+P3mF9R0f6xW/rTsZAW9HlwPxYxK5m25HNC05XCqEhRXPBf9g\r\n32DdGm1QBR0Di7g6jetTBKRugHQUrpiLLqUpKGsMfiTK11q0HVvPtzl0JQ8/\r\nIQuC+w9Uci3vQ8FyCVi2Bvx7+SNGJZ9phkM4zuDkCJMIU5H+g435C5glyV+Z\r\nKfVVW+rlM04/yv7b8m0Fi3BcAYKlGbnspK7B8SG76VayF3G5qX6lLxGtZpUH\r\n7tVimhbSqPDPC5mSFHgpD63OObVA9ic0NqpxAqmtCcUAeITVSs05s24XjR70\r\nZb8v2yxAN7dw+ceOwJaf5MyuuLuF4Z4tGNvSTddBlTJjYsDyaZIC3TxTl7Ka\r\nvB1X2uuO//wd8W+jTzhQke8KDQvbg+FG8qycZ3CnrbB3HYE3duR2iJD6HyPx\r\nIeiVb1MsH5xk0sTozu4to/xKWHDwhd2zlk8S7whdpD6tddl/R/2jt+TmbSMf\r\nBxkWsmuyCaRISOy2N6qU6Bf8CRSzTzCGq7jJQSXZcrMqD7FU5c0V+/f+MEWw\r\nEyV910+46F6upvncmYp280P8uv4KLNqRExfOYE0i0Ymi4wcab75aSDAtI6Dx\r\nwB4CXL8l2zVniPpJJH9SvETvE0n0TypniGK9IITY36Iug1dy8aCkAwNqauc+\r\n8DFOVETU4XPv8Lw6eNYvv9MoN2qCehb/H9U=\r\n=4Tq/\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-pg_0.14.2-3967f06_1671189722533_0.08308314320475141"},"_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-pg","version":"0.14.2-e902ba8","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.2-e902ba8","_integrity":"sha512-ECBD9h/Z0CZG7L+SqyK51d5cgIxpaWGsAQuKGz/prtiOr5mVQY/GvZJR1CNI0M3e4c8hz63+PvlwBJQWKo7t7A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ECBD9h/Z0CZG7L+SqyK51d5cgIxpaWGsAQuKGz/prtiOr5mVQY/GvZJR1CNI0M3e4c8hz63+PvlwBJQWKo7t7A==","shasum":"85e37dd763dad564a1b8d866f1fdead13699865a","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.2-e902ba8.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD7s0gK8VfRyyI8iYtrPR2/mXCfHz4OZ9rCLSQ6/SIevgIhAPhSZZWOJK8UnE+iXt1L/IX2cTDxvf/1MCzduUMJZcAV"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnHIkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoUig//TlKOBwcGTnmbuhHP2SHOQtcZmJaWnmCedpLNKag/MFu2303m\r\nnvisl689gqvowAWUcjBNiluPesoxzTN3rfbG0FcSlWIRDVxh/s7ONOvT/BSi\r\nUW3jOCn0kzhdbFJYxzY0/6sqn2UZMLlnt3SSfggC/VeYCfy7iftNejyAzdeG\r\np34ssaNDXx7v7hXkQhlELZcgm7/Cvl+W4saug5ACti2jFhCWp/8e1XlgX0oK\r\nEBjtCnJOmoXJFK5OIKyAoLiKDgyjr2hyZ9IxVmPCbGh3VIkXqMZr9dVnimOd\r\ngZvSaMG50pacrM/ctGa9K6XITVzr31FO5GDF+3NfoM8pz2TnciXH89PCm7aI\r\np1sToWm/3QXIyp/wh8hd7ppSKc4CdG1QTjF1dKx0qzzExnfdiRSzAhI+piWB\r\nmqo22ZvZjBHrH24NZFkbUB45Q7Z9EFC0U/FrjlVnw+HnOck3cdUqhU6Xgxog\r\njWHcpS51gau/WsiZWABi0TZCArMoSXT3NiQI+FIY3MVFj9pALN0xMHuk3K4K\r\n8Ng+DQNrUM3a/4rFg3yAWq5DU+k1SfylezaXCLkgT4pI9IJCnmjXLzMS5S7s\r\nKic7v4+m17l3FIDKXQ0NGUSMmvnQ1ETXTC+2nyn5v5k0a07IBnuz5IBofzYw\r\nvhZPzrEvndyql0KfBLrUIoRfxcMts8aCxp0=\r\n=aifr\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-pg_0.14.2-e902ba8_1671197220059_0.06417432281161406"},"_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.4-9f4af29":{"name":"drizzle-orm-pg","version":"0.13.4-9f4af29","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-9f4af29","_integrity":"sha512-L6C7fI5ONY0ZA8hlctqwMsD6ncg3ZSrPkUE6jQM6AKSH6eilGqafbp2WJcbrrnbxQ3k5MAOnN4kliB3FjD2W4A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-L6C7fI5ONY0ZA8hlctqwMsD6ncg3ZSrPkUE6jQM6AKSH6eilGqafbp2WJcbrrnbxQ3k5MAOnN4kliB3FjD2W4A==","shasum":"0633c90bc614f4ddf7208b9078a855d2c8fa08be","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-9f4af29.tgz","fileCount":150,"unpackedSize":221974,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBw2soBDFESaRkFizJ90xRWqTlWBV50CCk4DDF9kd5gpAiEA8cQqufUlPrPU6CT4KFmpCm3CJIbYcIiLKbPL1kyy5GQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoJ3QACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmouSA//br0z3oHyLtZj7KuQOiwtmj394cfI1Jw5v+IO05EQx53mYOIQ\r\nhcyx72NSWLk5hue7CiKf/D2w8UzbuqgaNVkCdJEuVqP0CI8HiZONPFo3ZAPj\r\n/3JXNH+HhqYuy6xE/63bF7fCxMHOHX5TjJ4VH6T/A767UNHw8dKF51cGnEPM\r\nC2t6eCyqrryueLUjrBTF5It2evLKPhUaxgK4DDZMUAn/nTwXS48ZBdDaRIr1\r\nsmocfl+tX2iv0czXw60hSW2ZlXtBrhEM7/EGExrqwWu+c30EYN5sE3LYKozL\r\nMbF7RoyqZaLXHe75y+RedspZyYxlqH7sjP5e20NBUYz2EHkQ5u2jZ6qqVSkh\r\nhUgWp2S7srmi1AOPyEun4/fbLxLtZtqScsYLh9hCqv3EXdOZZmeFk5tZx5pR\r\nZ9PC3GunsKEpnK3cXumVrqWngLhiVmxEACBNlSG1sLLgp7zmHftdEWyMrMSZ\r\nsMFhzH2dCChjSkSP87mbW7jSOlvPaZvi/oG2z2SPAy0Qc3hpAy2uq4x6IYyj\r\nKNECwn6QycKl4CbEp7Xhlzf2t3GvR5guuvPo6TohKk/YkIFZxLQHWEZqyMTh\r\npIYxhXG5XMQXgMJIGrub8r8btd4ki1sanhr/x0UB7QykqU6XMIeLoyvzjW8F\r\nbowJdjUxmZ2dT0ggZXBatG9AMuuVIyC5eMU=\r\n=MAXO\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-pg_0.13.4-9f4af29_1671470544416_0.3021466167267164"},"_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-a52eacc":{"name":"drizzle-orm-pg","version":"0.14.2-a52eacc","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.2-a52eacc","_integrity":"sha512-jrtSbF84eBv58yZICc9KQLnDJNsyTiAHzMhwTSEZRaET2DBUVOH4OQYqbVHiFpxaXoZ2EepkUTop04Fbgdnwgw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-jrtSbF84eBv58yZICc9KQLnDJNsyTiAHzMhwTSEZRaET2DBUVOH4OQYqbVHiFpxaXoZ2EepkUTop04Fbgdnwgw==","shasum":"6d64ee7c7f32daf96561b085289d959201bdaf30","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.2-a52eacc.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDx1vGdMBl17MiY26vX52mceR5mNfG8sWXfyh/2GV23uAIhAM9q9tIEbmSKqNee4oBXn+GT5rjR6NrAVUsrV2Y16+d3"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoKL0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmojHhAAhkiBUAU87dhT85QWNvHGc9dbmsEdwWqAne+LuugMAyxAVlD+\r\nNmz09fKoEsaxab0Zs6Vv/OiDk1v8hGBiQQG+JC/29rPh/gf+4cZwSn22IYj6\r\nTDhleE13e1+agOg8uN1DQJHrb7A6ftJT+1nyT43GEN64SbZHWDzNMu5CDyHJ\r\nHLUP8V0IACPUHT/zswlZGKEkCqGGl6nheC/11fKsL9qqrxHI3ZyJdB7UtzQS\r\noPItBs+GQMSz5rLqMycxAR67teeax3M/wGBxBGhRNytS4vTBOfvYw5o49rPY\r\nzg452GCcY9Jqm0moHzXuEOH4F7+JmdOOT0/gevYPyZDvUU2h9TnhmVNwHTZu\r\nNABoWb+u2/YxDWh6GaPFTcIbdSabUroSOLtmTF36ulPH1VGEXjHBcOUU1Ieq\r\nN0DCEPs8V07F/TMVQj8fGJcHp+rLCfs9reQMzvZMSK+9uLRPF2orQRT1uCrh\r\n8PERgQnePCoHFn1yJw3/wOwU/3KRlX6avc48/U/MROqtz0detyJNNXz9f0zI\r\nHcSMY56sbaxsGMXDUHM357yEFcPU8CyQyQVBCCSVLc9u0t9vMVS1ElSIcd9V\r\nrxIkRwa7IRkvl2RyRly82zXfoa1cTosvIKkY+gV3bvdGP0FNd/+yVA7NS10A\r\nJnqNg0T19xoW7SxkNPLnkLyLQgjhEfr9yEQ=\r\n=UZ4c\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-pg_0.14.2-a52eacc_1671471860132_0.9830340094376939"},"_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-pg","version":"0.14.2-5514014","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.2-5514014","_integrity":"sha512-PaEezL1b0/KbITNVTd6/vzDd9SWaM+xk1CLsWO6q1N+HTND+vRZoaJRqfN4s2/X0CwNO2p71Dq/jDvUvo/DuAQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-PaEezL1b0/KbITNVTd6/vzDd9SWaM+xk1CLsWO6q1N+HTND+vRZoaJRqfN4s2/X0CwNO2p71Dq/jDvUvo/DuAQ==","shasum":"b14df965e5adc19fad553af3cc21c19a962a63c1","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.2-5514014.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/Lj5XhUpqvjZWBecuRzl5fRjN51V9Z3+ss8qvBOf8xAIgSCyWQysj81laEjtuosutxPfdqlv8oCzAKp5AJctVXRI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoKM1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoj8hAAivaWFWfJ16w0SOdV6Jmeo4MvH1DwlJSvSiuWWkwZpcvXhjUG\r\nPTjeIyM6BOAiv3l2KvPUzvolNPRJWVtYyahYUlyyYO9tnhpRY5w/1srRhd4L\r\nSH8qLCvtkOfrlf2s1LzDbb0iSdRtIVB6H2V6HLVgeaNN1e77BvJ0AvyTzN2E\r\njrdfv9QnDeCgR92SMcQKjxQsCY7nXYEvt+cHeKw+Us4ONrhl1TRzdkqS7nlL\r\nEOau1oP5PDQ69sjtyjOTw471IrycsLqCdryihpbJV3rxRauezFnND/aqbhtc\r\nchDsz8Wtk6a9qFXGFE+iyQ8MfzVcntpQTI52qoVQGRl3UoIpp/i8OmKMVO1x\r\nrVpPNQd84PotZ9ca/h227QBg8Tn7kNCTuEaD/yat8soUsr7e9B6NDiHy/e2i\r\nLR4KZJZJ7KTAk3v+xItPaOTwyM7ws4jXVKQOZK76EW4HAcsVQadH+KpTSQP6\r\niYUpdkKBk/u3OAT76UIdnYB1mCcsPI+Tgo6rp4BOEnYn5U+iZO2JPuUA1ZZj\r\nNkpdyZklIKLAHedhtyb6nGS0yWmPnJ5qoYHWD4ZH1m9C7NgT8pNfCSxb9/fp\r\nMRA07wan+vn0SyZtJc7/DEWn7CgIKy3z1qxzvXIeVG6EZSL56b8b40aCJxrm\r\nxU5SpcbKDIsvJtDiHkTiyDW1oax/Bj7kWHg=\r\n=IO6S\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-pg_0.14.2-5514014_1671471925252_0.4137794581746548"},"_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-pg","version":"0.14.2-cc06fec","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.2-cc06fec","_integrity":"sha512-LtftwenkZ92kD5Bbj9BX/NOKZZuTYvhqEN9+8bGzBuUnr1NZOfRisfIkYmwFHHjZxmqksi9ylABa3pudhvlHvw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-LtftwenkZ92kD5Bbj9BX/NOKZZuTYvhqEN9+8bGzBuUnr1NZOfRisfIkYmwFHHjZxmqksi9ylABa3pudhvlHvw==","shasum":"4277904de1968e0222164e57aede80511959e816","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.2-cc06fec.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDcsBgrDF2ZMfJoIcBPRyoXQv9Rm8z0WjLUdDDf8lxIPAiEAv+l0NlNvAXeaZ+FOegu3c4NZsyR+p0DBjbra2T3Ty7g="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoKNXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpWiA//ZVzH+S/U3qCgTPnbmjtWss+Als76/UiMCagjxAM/QFIG7DEY\r\nFfPOYfewGB55QdkGLzkqwco9t+R6aMvTeMdPvRkuZwSfXom0kOMw1KfEpmdV\r\nnPFmPv3QKwaxPaFLW3VYiP1fdEPBASK7+lPsd8teMdOPP/CBn2OBIJLORIwx\r\nqhsdCwS6gRNMmCzne/w8zNiT66eUvedPEafWHY7f7YF5QPoadMzei89epTn6\r\nQEbueRRY3v2bslZ2k5Z4KXMyWmb/5n2K3ezWeE0F1d4RXU4ntMFRROEeG1qs\r\nQdr2YT793WQJA7FSGZblTnD+d283ItkA2GetMRXsVlzAiDfsTpvjkVcWp68V\r\n3aqWHDw5r8QyMrwC+b9GAh265pzHoxmDyhtO5cth7oKdYJm5xwU8lPQwuhPs\r\nDB5/yndSvpSA5xDLRCK8zM2gMZ4ujZRV1URuxkX3h9wxyYz7jy/lCVAEmRmc\r\neU90CJltY9EXOc6jkcyAOpgFUKsdLVK9y5+Er3euTkiS9yYR5KE5nkqoYO+2\r\nfiQfeCH4bbXfMrFjpBXuIh0x0w4E7eKAL///69NeBNmxTU2zcPYVysY28p3V\r\nSu8xsZyOhzPAEaIe1GpfXnellZMMHG7E8CzKa5iLuJ+u9c6aOmTtW0NU9eZ/\r\nvyfv91Bp9W/SlS4Qam3yVrCiz0PO32RqVUk=\r\n=EW4p\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-pg_0.14.2-cc06fec_1671471958886_0.2913885550373352"},"_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-pg","version":"0.14.2-c7344a5","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({ connectionString: 'postgres://user:password@host:port/db' });\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, varchar, uniqueIndex } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', \r\n'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', 256),\r\n  }, (countries) => ({\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }),\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n})\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id)\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number, name: string }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({ connectionString: 'postgres://user:password@host:port/db' });\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' })\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.2-c7344a5","_integrity":"sha512-tZ369zMzmDDPY26jdmPsDTM/cAInRpycEFC5x35GusIhISu1vCVwLCVCzC0ogq0KL67LsgUEx+CSExwFyqP1KA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-tZ369zMzmDDPY26jdmPsDTM/cAInRpycEFC5x35GusIhISu1vCVwLCVCzC0ogq0KL67LsgUEx+CSExwFyqP1KA==","shasum":"3782e5506352c0f7153e3786a240e0da581cebc2","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.2-c7344a5.tgz","fileCount":150,"unpackedSize":220349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC1YRHgP9OHQ2sAy/JobkdIFvBz99cNC8LqS6kPbCy5VAIhAOgqc/MM4xtAbgDuK9MY31BTKRGFVoPtruuHNJlBUeDE"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoKOMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoqYA/+NhQowxc7eGkHCtQ7uXxQEFb9f42Rs8e24YyRBnqoiq+8G/4Q\r\nWWcTpe3/xa29DA+i/W/f6ZTqcDu4NJRJozIX/kQ3nufTSyP65RQ766LXX7x3\r\n/MjlfvRCLYoO/HnVwbGxDsIdVxKO5KIgH37JL9Yjn/C+bs8kVBmywwq7+iWH\r\nuPLuKxp7cP2xS03xVN0qV8IAJ8eg/mx89+OLUnHqErxpQlWOHcBCQMO76CMu\r\nLo35yccXwkIgz/hTOrk/jo1Lc46/qvhq7/o2q/xC6CpYpGAPufRVF5YQaQ/9\r\nd927X2XV8gEPKQ7SJzGxGXqQ2xky9fUpd/G4T/AiSj8qix6I0l8kDe7/1SQr\r\naie3TXibAtWTvb+deIAXpSrq7aL3w+rYvv6pZf1kVgCkS5qM+a79wm5MAZSN\r\n/0m1q4zS6sCUc0MIeHugODOxxKMqvlVsAwT8tT9j56ImfC6cvS5TrTIopPRr\r\nZDANTSpgrvf6Vt4whdsfNlaOp2QBmOwIfSb4181kuKCjVFgZB4wr/OJjFepi\r\nuBCzG66jtiurMQpuSzo28jWWTyHuM71YMkxhSglvdtqH73owIPMMvW22r/Eu\r\nL23Aw4LoFgUaLURFV3pctcHk3k1FZSR55SLV7Kn7GEMRyqECvPpELFJlLV/z\r\nMl9osb3iF/wV1YYw4xVdnU3iXdrpbQfuJ8o=\r\n=ASvF\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-pg_0.14.2-c7344a5_1671472012155_0.8413740075958347"},"_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-01c3d82":{"name":"drizzle-orm-pg","version":"0.14.3-01c3d82","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-01c3d82","_integrity":"sha512-BqnWYq9JVEVyn5kFgJzEgYwS3flYZ5i6ylMUDf4TG0dZhiLT8dMxbGBxqhOHCrePH25ld4tN48BwDs3A+rAWJw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-BqnWYq9JVEVyn5kFgJzEgYwS3flYZ5i6ylMUDf4TG0dZhiLT8dMxbGBxqhOHCrePH25ld4tN48BwDs3A+rAWJw==","shasum":"290ab072915c074dad87d2becf722bb951d70adb","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-01c3d82.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCAhDpMjP6wYZpivJLxU8e5IcVeD1YC+ZlRyhAzF4/+3wIhANpXeHwQQ850xscgcoLlWhjKsUPvb4gew+QGf2lZo6E8"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjofyXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr4aQ//RzGkQZRgjuLDdJk87K4KcVddW6LBLppjKesUo1n7CRJGiwO5\r\nE83iHSCFsnwe4i4YYNPNGP2XSHnPDEpj0qJXE1hy/BphccfeBwuxLYEPvP91\r\nfeVx9KOQiWygfNbSyqcQBgOr2/a6IejObLkvsupkTIorgvo8j6jgmO6wbFQL\r\n4KbqG5LjcnlvWZPXs5O1Vd1Jzd9yBcZA3ybdI+N0GVnoVVlrkRU5UJfKJHjr\r\nhiYMzVGdvZJoLfTxHkdbNRo2jcNlcuXnvxDE88KUD+9SyKO5p967YqQaD89r\r\nwW703znysvwLf0DvOOcoDmlWDizWMQEYkoTHKo4lDCjvoWm1jTtwYMSCj/Qf\r\n6CSFxsCwsj1rCo46x0YXbnpuqTmpE4hOpmTCCMCcqm0cAtGOKrD1lS0qZBsS\r\nFplB0ErzbvkxVFw5XVo7Shyws6YY5KrdDB4czLVb1ANkLjQh7CRJQxaTtJjf\r\nsZXw/ZoUPsrNq9bfDU0x5uizrf930wkFzxU/c7IoqQqs5eG9yPYAZVvuDC/4\r\nzoKqE+TAQ0Bp7q4L3Kj/2htDGX4lu4aJgKn9GsaKPrnWe5l5niEofsr2l3hn\r\ncyM6Berl0Mg9eVZXwHL34pTJO43XQD4X7O+LSI0P+vZG+AgxWm+Vxz868Js/\r\njHi+lSMSB15ZuhmYRBCq5hb8JUQcKMau3S4=\r\n=WQTI\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-pg_0.14.3-01c3d82_1671560343722_0.7861380658623469"},"_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-pg","version":"0.14.3","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.14.3","_integrity":"sha512-GjPV5WuxxnSdfnL3o02VJaZUwRNJL66gtAQTKEbyvRBNH50T4BZB73oAbmvuuW3X02XmmH2Z3nmPn7ChI8MDmg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-GjPV5WuxxnSdfnL3o02VJaZUwRNJL66gtAQTKEbyvRBNH50T4BZB73oAbmvuuW3X02XmmH2Z3nmPn7ChI8MDmg==","shasum":"740825dee838cd8b6356c28d611eb889fe88be98","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3.tgz","fileCount":150,"unpackedSize":223033,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDyezyL37BDvc0JQpHcvr22Q1Iz2DLFKC84MiJH0M+oZAiBSBhQd8j4fgrSBUdWTrpcBEAf7v1SkZbtVUm/6I6+YRg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjof0aACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqmYhAAiofd5HkM4avcaOXA5zcc6rFFQ7kKHPIaD4675SELWu3yuZ0s\r\naDKfFH3VHTVutvE9xLx0v9HYZFYHyfjOChdSumakS91hDY2Lm0bcyy4mvdAU\r\nZtBkUkP6H8k+nbmi8N3yV76Qjuu24cLAwmD3fJ7hsWONdD0u40zNfmpW94bJ\r\nqIATqyKBo/yEb4fL5mjvLc6iyH6Q0ru5jrp5g8mVUYswWTgSEl91mSsF++Af\r\nTS8ILQ0OwM53vIiyi2bu3JK0HMu9HVFQFeOPBnkJksL/6vXPqZPkk1GBNUAn\r\nVZAWGubJOPBmIt790vfsMFERonSMEE3PhOomBeWcVlii/6qN5Ni0NFWTXuvl\r\n6K3q+WX/p8k76xy8M+pyoUF7NsHtBo8MbFiHaK7E3EnUqIe+hWI9hXunc0zB\r\nyRKXYv6WQyt9xjBjvnVW77wB18lZBvctsWhgg5jJUar3i6P2sznqyt+IWAty\r\nZ36ioKycvfsuNwjHaTj+IZvqT5JRIaV1zA8S56FT3qDxPVpbntigWSmdv/xk\r\ngYHihe/gLq2iz/QY9anKHvZnDmskYkTS9Ez4z5m9ro8Tz+GRO/zvAwAzHMcD\r\n80RdMuTQk6s+EPtPZyiqpslHp/WCV95x0R/JYQilNUvuC/i9Y3LhkgcvKbdM\r\nQ9uI/Agurgd2zw+f+s1lMm68+cFm/9g6xN0=\r\n=K1ks\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-pg_0.14.3_1671560474362_0.43207253591450767"},"_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-4eada6d":{"name":"drizzle-orm-pg","version":"0.14.3-4eada6d","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-4eada6d","_integrity":"sha512-L7OReZtGqZMIXBrs964GpZ9uiNHeqLcHeM3LxoZz82ZSmOxJ4z6eB5YFlfmxnPVo0b2fW1b2j5QfhkWs0M4/tw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-L7OReZtGqZMIXBrs964GpZ9uiNHeqLcHeM3LxoZz82ZSmOxJ4z6eB5YFlfmxnPVo0b2fW1b2j5QfhkWs0M4/tw==","shasum":"3896375046c8988a8a8ca6fddd056722533c6673","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-4eada6d.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB1N4zgwUwmVCqfOyuoaT5j/g0rYDZl/9LRXC2zYx7THAiAdWq16dHpUYctZC94TCliakP7zSc27LlMWE7TPrN1Jtg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0eNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoHkhAAo4S+bPAm8B0YN8FrU1TLMGAi1TtBXRDFxbM4QFcU9yPVaktg\r\n2+CcNQ+kGZ7Vg/j1y1Oq0wQl4wnxhrcfeZO9urhR5PePOgXu51t6En3MDvVt\r\ntU7gUB2Z65Ueh2IPe0nObKWHMxlyJrUJ1BIo2QUl03S4l+tnws3nYqx6wlKN\r\nkW63TjAe2VVNmTwoNs1kBU8glr8R1ijKbEiU4EwRyQn7j16RfC8J95s23D1H\r\nExxuUzDC9D+h5zzQCeEwawlZdMV/b2/pouPBXICdXNJQ82dTSAF1jQDxoKWx\r\nWOZgSe1Gew+NfJ462rxJPTtPHs5RIz0RFIiDOgdiH12V/7u719KXZ37q8P/j\r\nZr76Bo+jnju+fhF9jeVJi69tGjGZ1GRO5xesct8nyiGGNlAtMewN2dD7z689\r\nZMDZuj+pAqSDfba00MPpHM13VD07zzmbD+0pcOWM4Fgoiv5ckwbOH7khElH8\r\nb62ov1AAAG7e2R9Q/+An7Oa6OX8l1HFdcHDBrDbemZ44ZeXDPaWoGjFZ3WSj\r\nYK95BWlTdIVKM6bxyZpdVWSKCeIOXJYyMnIV6SmRVG4LoeuN5wBusiH2YlzJ\r\noUZ2293/0BZvu6ZgpVTaFxL+AajAFnjZEr+BBO8YkzmzheFZ+8P5WRIGadHn\r\n4iyR+6N+hpkKOFEfyLLlHOg/J0JqJRcMZnc=\r\n=kiro\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-pg_0.14.3-4eada6d_1671645069192_0.8863576698746483"},"_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-1e42665":{"name":"drizzle-orm-pg","version":"0.14.3-1e42665","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-1e42665","_integrity":"sha512-GGtHHW6EafC00QPEmHfsLtLU9td1NpJNA1I8fJOQPBJaGbNyi+BMnuj+BoOIGpAj40dwnh7R1dNHwVdDjKO5xA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-GGtHHW6EafC00QPEmHfsLtLU9td1NpJNA1I8fJOQPBJaGbNyi+BMnuj+BoOIGpAj40dwnh7R1dNHwVdDjKO5xA==","shasum":"6d3caffd8b7fd239080edbafdd7747a6062f9692","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-1e42665.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeNZMFKFo5f3lv7ZM4jAfXyP2k1SwB8srIapkN+ctivQIhAJAdcwZg7AVW95CNlondHEU+MHyFoj+oC1yVCIp7AhFS"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0m7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmorMA/+IUVk8YZtXgKLtGt0UQYI7Hfy1dKz09YqE5j0DslakWQn41IV\r\nktHeCG8obqfq19OCdASPARZQo7OpcmSlyGhfMg5SoPSiAtoNwR6hr3zo6aaU\r\nPa6EWROIAH8GGzrSDyTnaXYXp3kD7XdU2WpjhNP7W9947CmqRCrY/i4ruk2t\r\nlfpGe/IFbzr9X9hs3T+0Tnod17iCOhBn2o4fAcaCbK/iZ2K2Xn8HP6Rutc0k\r\nLCpfLvHOw/zuU+Yf7wIYAl14Hc/T9kKqqjR9SKa7PtsA9nkc+CrzAtVRDecF\r\nFmfSYlAoqpqV7Bkbm+6zSqYXfE7WczTLh33flkS9Ax2egwx6zYhpRU+tnOxz\r\nkyiVx8aS9Xcml5UiN+sSOcFETNi2YRIEtFK0P4HJEUasjYZ2s+I9BB0gqhU+\r\nqTwIkDDxY4cplVm1ZuA0yNTzxzV+UV12+Di4qCfY3nNXL5yHTaMnKWh5tx7w\r\nkyjoPxtVvItpl+1pgfV3iSHjXCnU+Y+MD1I9efSSc+/ZGGEXtS+fXcb6CVr6\r\nItmw78sd3EIX/92Eb6vQcSERoz+XX8fvNv8XdBOc+o0ooSCnGyP2trY1sc3p\r\nv5LQfqGEuru778Kyz2mdH07I4AEdNTClYexROhBBYPUTzYQH1UZuO4gCTchI\r\nZHuuUQuMziF2Y6xiTDhIO5SOkcNx04b2pPg=\r\n=Gojg\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-pg_0.14.3-1e42665_1671645626936_0.028365342879642874"},"_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-c153bbf":{"name":"drizzle-orm-pg","version":"0.14.3-c153bbf","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-c153bbf","_integrity":"sha512-9HTUMNCcdkFmqIe4WdNeqDduhEAKu5PgzKl8CdvtLE5uqJVcQJB5t/VGztodObGEANlxRn5TSGk8qSCcSpj5ZA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-9HTUMNCcdkFmqIe4WdNeqDduhEAKu5PgzKl8CdvtLE5uqJVcQJB5t/VGztodObGEANlxRn5TSGk8qSCcSpj5ZA==","shasum":"a3a6be88e6e414629a06fa3a0e06fb94b1ed2f0e","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-c153bbf.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB4jIPzDEZVmUH1RlYMVY5KCWKzdWaZBRj64diC644q0AiEAlz3gcqSyw/wFYsCRix7uL0LJRvKfMtB9fIxBPO4imO4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0uCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpETA/9G9Ypbvt9SK0q3aw0FVNv1mF7StXoKGavKwuFbSdAEUX+HIGD\r\nsb/I3FobBvTUQAwwZHav3kioaiqNDgE1EaBtlD1TAqJPv41IpesdgWrN51nw\r\nwNSFp1qBK0OUceVoF0vLD0lJkgHpkprzYWnSMzWjgN73YMSC5hFEcc+RtsVj\r\nDqbXb0+GzZCry9N0u1wjH9ozsCFIDqNTKEAq9Ti7UqBah4IVNzRsVbtbknBL\r\nZF5OeYMxnkqN9TakwqsinV0p85mbNGOBk0YB8i1dboAbb1DQ/JUyaX2M/hG6\r\nEFz079OHqAAM+nMnFSxSjHBerJpjHkL8fczC2z85gOw4NEqMpbTDZfWiAKKP\r\nIYNdnuUXXkYI67QhEN+8iFUrfsB9zc6wXjsq+Oep/WRSC3vl62gFJm4buh2i\r\nqELe9UbQW405aCAQROHOq6yMF2rSjFZPYRhPuYBe5WyYns3iUiFEy2Uf5CM3\r\nee6AkNTB22SgbsyvhOrSulHg4XvLMN3DNNMn6isasMF5QLL/QKo8Lbh2Z7Jv\r\n4XFksh33ri/oLaWuvabAf0aOjjPwU+t9BDMXPqUsY1MuhXaUgm4BkqAsBDCo\r\n6ijjDZ+sw6YOEzmZnGP5JmeJWSP41/7X/9PNPjd1XZqcXj60XWJxGDJ5yk7w\r\nKMsG1ymAT1E20PvVzgHQ7M1ZLvzcC48Atlo=\r\n=gCr0\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-pg_0.14.3-c153bbf_1671646082646_0.404620007004894"},"_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-e295848":{"name":"drizzle-orm-pg","version":"0.14.3-e295848","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-e295848","_integrity":"sha512-pBsKp+wDSuAqsJkZ/FzrWR0DpFU/r+MYZHQmcorIOyzr8PJ9od3LRvd/2bXlz77B7o5plyJkqWWuhBmOuSggUg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-pBsKp+wDSuAqsJkZ/FzrWR0DpFU/r+MYZHQmcorIOyzr8PJ9od3LRvd/2bXlz77B7o5plyJkqWWuhBmOuSggUg==","shasum":"1342d7af2a91b6a80d820c19fb49f43b0583a775","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-e295848.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0mArIWizkCPvsBVqvxXRRzJytBwqNLRy6OX5TEdpyggIgXLvH4kTms5gToZzE3p5vp7gdssy92BCxEA0C6GKhAnw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0uLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpyxQ//cFI5DfFvon0SlDRMQwWBiKoWEqeGbngHIqaMLSR4clGbtbqz\r\n6NPEmeaAEHCY9Ox88zDmMUiHkUQZdeuIDNqXAA6R3hwywActbkckrk5XTyBs\r\nAIQQ7t3jnVgjt3oyIIPU6eYK29J6CsbUbF+eQPmiisdI4s04FDvztFUOqR2x\r\nUGdJfH+jIgZhmB0SpX+UXGOMwjLKb4ViK6ApdkHLY/8DH4QZRIHZlrePmOlW\r\nPOTm1D7P1ogNaWgn0cOBbm0EyERpaaXkA+ObFQrX2oy4cz2ZWd9La7UC5cMh\r\nXfPk0eaLDNB5iJIMngeA9+zfOn33vY5sTsOBlQWoZBdQ2foiSbp0+b92dk0N\r\ngG0IYk8Uz85vxBjUnUx0qeeV+QxlQ+n3fnHuUXK0VAjO/nX8L2rXn77kagO7\r\ntPmlra/C4jwA4ViZGVRP+AAHAfra5FJnoYxyT4i9XHHR7YlnM1n+IBkdrVAo\r\nzjWySnOZiBBjOcdWCdopGzpWYYmhzYYZ5Yw1+m3CEq168xa6wbKYsa1ZQ757\r\naIwakBlafgfphJb3yb9EgAed60wqfooKs3V2GsQkQu4tuMiEpmz6se17VmhW\r\n5U1EV+IzA53+p31IhI4C/Cp9tZ9v9WTOYmVeA+nXDeTeDAoKRVWJ4uvuxNXN\r\nC/qFO8pnw6jeLUncdeZU6M+KF1n39VFHlco=\r\n=S7tP\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-pg_0.14.3-e295848_1671646091304_0.5435233227561462"},"_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-6f226c1":{"name":"drizzle-orm-pg","version":"0.14.3-6f226c1","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-6f226c1","_integrity":"sha512-+94mp1oyf+rhT9uoAUD+1pnQYr60BTcIid8/sWDz5F5dBmvqCXiA+YwAWVMGU73eAfTrYZNyiFnsHGGX2zxnyw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-+94mp1oyf+rhT9uoAUD+1pnQYr60BTcIid8/sWDz5F5dBmvqCXiA+YwAWVMGU73eAfTrYZNyiFnsHGGX2zxnyw==","shasum":"1630fbc6b11e04fb858007b851a8d3183308e59e","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-6f226c1.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC4JfIs0vVEp2aYEti436uctbytmyT3a9+xj+oyE0g2/gIhAJos08QKDO8X8XoU9cncxOB3ZLOz0qpakboTW9xuHF8Y"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0wbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo7QQ/+PcukHx6B3NHA1wTjb+8mx47WPf4G2Sp/2OA8bsKDk+i9Zkjb\r\nhk30OFOys3Pp6/XQf4nO5JjyfXqlzYdjW+NK/ZLjKeTD2/X1NrQCL7n2qTxu\r\nfNi+voe8oEbKWEDi28CnZ2C7ImjOYPvH1NwdFUKznlA7GmaXWscJWOnW59Rr\r\nm20jVUbF1hFA6iJkBZiij9/asHTsIqMDwAil5n9gmZNliXd/t+0Roy1CsFRB\r\nEEg9hjXRR7Oh2O3pZKdO2ogtma3gV/YWmUBz509Zxgrffk+APmpHrPdQO+Za\r\n3WeYKR1i9JFdZWxMVdT31T023QOGmNzko4Q+sKkpfQtDIAfQRQc+C6H03+x2\r\n2ksyFXg9wVjkwz3KErH1eLXJIVlpr88i7m2ysIOkmm6QcjsMycAFajLUxFea\r\n/jAuoL9eaCou3T9ZM7+PYJqoYp8IKA1ACtWELLQ+hgf4yvBFDYj3J9GnoSQE\r\nZBzngQuBGrZ/b0HTjzCz0ul54YzOLqjUt3tTyfQllTLLULzk7vlD5Nlem7Gg\r\nPxpJ2swDYgVG2nEM6rrPHfd4VA09l8F+vgHqA1cFjyXEvwBmSzRrpej9RbAp\r\nCYblomAXfT0EtMpMtXJqh588i10XSWsjkr+mBChFJbT8w/ZHG+wCYj+uhK28\r\n66Lmd8UAKVHCxcCAMYmS+hDYzQ1Gc/cNruo=\r\n=mRie\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-pg_0.14.3-6f226c1_1671646235719_0.9730434544765174"},"_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-f8d0d46":{"name":"drizzle-orm-pg","version":"0.14.3-f8d0d46","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-f8d0d46","_integrity":"sha512-mvHv88D6S0npXBu6FESFKl0IoEaaEY59vq1Utz/gy37N43RLrN42/7gF1N2Kiz/u2jQrHoGxtyOoOCBvBnXa5w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-mvHv88D6S0npXBu6FESFKl0IoEaaEY59vq1Utz/gy37N43RLrN42/7gF1N2Kiz/u2jQrHoGxtyOoOCBvBnXa5w==","shasum":"5ebced0af459e42fa2aa2b475423e4d8251852d7","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-f8d0d46.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDDYuGeDdo22l5RNFKJR24cC/XCAEX9g8gM5+3QhbfCBQIhANMO8LUjDsM0WqSxoJ/U6WXzcIUvB/hipvM8mBYSnr6R"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0xZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpNWQ/+MPA8js26PEW58qWyMia6CqipNP6D5zZSX1ru8DfTZNhrh4AQ\r\nU26oFEP0zVJ0zmToGX4IiqRmUKHzAf8Z/0HwaTv7GlaDC+/7UVQJn3KIinhm\r\nPbhYC7m0s2aHVgnnTPDka5+bc3ULXSOonJBa+AI1VnDwVPpDUc3qh2NapUGr\r\n9zcHxR+IZeFDJTQFJajE0KgTcQIQVgAOhBQ6zQp1rqfv9d3RSbEJges+OY6b\r\n3wJlv7s1dPXM0BrUcyB6Rx4hvGoKrPJPty+HDn29Pm1wpR1jcH0cwdJfH/ra\r\nzJtLsQ+hozayUiR4rN+59P7sV3RZUH7kirUDAiylv6XwvPdZL5sNh7sJJwFi\r\njklayJq8aTmpc6c5GK57uQd6X0dsUijfbCEN6c2JqXZDCbqGRNQkZTKsNyJA\r\nrBNP5p5xTr2QJIgLPWw8tXfHdDArabpSLvJ4ECM0JtA3unTjlHP+CkVrUe1H\r\niVwadNfBxixSvH1CZzr72mi8wSxpULJftw/ta1Wus5XqYzzyTAI+HttB3V2H\r\nOOp9/0HFiENf4ZVAzWYWTKBV8DrGuzNCfxAfBeGVFo+XzVlJwISI6BWedmA+\r\nngQQqzk37MAQcDKiZLoxAPuAyVm8ztrgPUyi52ROozfAaM/a73i9P5uGtV+b\r\nxX+ldxpNnvXAAzCwk/PJdaXoxfdm5MIB/P8=\r\n=1lVs\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-pg_0.14.3-f8d0d46_1671646297213_0.9382534590636251"},"_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-cce4cab":{"name":"drizzle-orm-pg","version":"0.14.3-cce4cab","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-cce4cab","_integrity":"sha512-ZkLP3V7RJPeoWe7Wj0ZbdLtf7pQmUAL005wSjt0N3QzLiVIb7ZFLtQO8nTwFG8cr5dFz53v6CpOftv6azWperA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ZkLP3V7RJPeoWe7Wj0ZbdLtf7pQmUAL005wSjt0N3QzLiVIb7ZFLtQO8nTwFG8cr5dFz53v6CpOftv6azWperA==","shasum":"d2db49296df50508cad435cba811c14a669b1f22","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-cce4cab.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF88RSIL/IwJhcb1L5C1FvwHxxMyfDjXeFpB/iaIuPl7AiEAi27TkDWhf/U4bL+fenkFxsUr82R8vCDLZf33yiHQfuM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo01IACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrPvA//c2riNrBRPAj4Ywj1zDHLXTRC5ipdXEJGb5ia1E/PQdipwLR5\r\nwrlclQfTzphs+/YztCrGrfuXbLz2G52jf7f9l3jhmXsP4L2BhJG0GWzbzyG2\r\nKtQAIPCq0X6xQ0pEKMUDf2n2Z416gblsTpxDNSgPHqXZtYLT0jej45xaTtLq\r\nui+lcmQejz0YBP54p9xL6l0WnOaucFcg9GhUM4ldViM2HFHoAevzd6RVBIaN\r\n94YIw4AxXveiAqFvMUoO1sW72KnGb8Cp5iTRlWDWwLD91axWK1tt4DvgEV1v\r\ndKGjC18l91qkU8ARp+gpPSIsdA+mQhk+rwuogNu6NC1JCd33k8SDShUSPSNC\r\nVKqzoc2hvl31vVfj4cqvK/IvSCr8umJ4BjKA9XklEXjLT2a6d9WloxjuLUzk\r\nLAfsaMdSz4bRk2uRQfGHEdnremUA5G/zvCJv8rWauBNS1tbM4bo/ovJ+j33i\r\nwJW0HRvwId5VLFJYYJY++aj4nxEUbq8BiY6eN7k9blp8Fc5DXdGhH26bOEFz\r\n2ZbAzLGJqz4lYwMAKeAoj6fA4UDY/fDk13jirv+q4X2NNM8fQJRzjK0oZe7R\r\n3wxFIscCcCG4eKcSMqql4ltHxydaUbLvoxufMi6kiKmStYl2HhRpKeXui5lI\r\nJrh0HAcSbW5AHfryMgZPSWI+647qy2aq+ek=\r\n=QAFb\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-pg_0.14.3-cce4cab_1671646536522_0.585971948565384"},"_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-314c1fa":{"name":"drizzle-orm-pg","version":"0.14.3-314c1fa","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-314c1fa","_integrity":"sha512-+xnfDdXejkKD8FM2gD4vJApHvV5onMBX8aiWAIr+Kn4meltvHK2G9ZwiQ1P8c7m+9Vfrcy1DJoxhwtkP0Xj/LQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-+xnfDdXejkKD8FM2gD4vJApHvV5onMBX8aiWAIr+Kn4meltvHK2G9ZwiQ1P8c7m+9Vfrcy1DJoxhwtkP0Xj/LQ==","shasum":"1a7a66cb6e27f2a094a89413d0f063c424d70689","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-314c1fa.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCc19QwDRtzZ0xsUOK+MEKb4+GupV4qSsf3nas8ScHrMAIhAOnBbB6vbNEv1EOyglr8iLQ2oj9w4oGZg63TN9UHtfCW"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo1URACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoM+Q//aFXnResgnNPTMKr1JyF35SUw6GIbakFCsNOQbQxjZ9axM/+Y\r\n+XeeHqbdWIKYKUqB7lZNWE+9gByUpXj2xVO9eiYeXv54OPI0T2DH6z8qca6g\r\nSDSDOw6fgIxv2DARiqGl2wZ5vJ6OjGULBj7CSht03VkheUqzZNNN+OcYhasM\r\nVpHMfKQ2DGH+TSD/feU6R8y3P8IUhSj9KRzbPRf7xZ8rtLyHE3s8Tcrr2fiF\r\neMGFU33nwRIidG8CoAk6OG0H1lmHWvppIzy+zqTB+Vug2JqiTrN54ZckxkM8\r\nBINje6UC6U+Rp5HeE9vAhhi28p0wtkjWs5Iu0pV5pmafWJ8RzNO5/WBCuz9r\r\nW4+vXGBj0xc9h6vqUAIE99DSfWjK0a9quWXxyjPZ9hgZgVOcOSAdeaV3dFYc\r\nizufnsJGG1La7QPBEfoOZucDzpExvq7eax5xZnHgZSQQte8SeaZYGHKUKwP9\r\nildmwNvpcUd+5rmMGEDI9NxebBkBzbXsOVbPcjvsUUnSJrNsuCWnUCYLfDEU\r\nxNOgUodvHvJwjT9g6/htQmuEXsovJxSGXPVBP7JVkEhcVmTU8yMB9rS6Uk6r\r\ntc9COcs4cmyHgEEkeOTvBzbslHWp89J1fvb5Is11cYlYTbWtPA1491dDhvXW\r\n0OEZ0o51X1WwUKM42q27Zw2JPYjWpLVtJuo=\r\n=pJC4\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-pg_0.14.3-314c1fa_1671648529554_0.05434477971524454"},"_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.4-b8ae68d":{"name":"drizzle-orm-pg","version":"0.13.4-b8ae68d","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-b8ae68d","_integrity":"sha512-EOJV+zwqyp7a4lasPbfRiwMlohZm2EMvBAWdxksb+r9k2VivxfZe9LQ7ciflab+iiyCuhJ5mdvjkCgaHBVkxnw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-EOJV+zwqyp7a4lasPbfRiwMlohZm2EMvBAWdxksb+r9k2VivxfZe9LQ7ciflab+iiyCuhJ5mdvjkCgaHBVkxnw==","shasum":"0b536457b5a1c3fd8f5257dc965d551459a0d272","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-b8ae68d.tgz","fileCount":150,"unpackedSize":221974,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSCfE7kQxCwY5C0VT0fUrN9o4RjbGH7FHz9eOXO+rQawIgbF27jrghsRh/v4EKf112FYqdH/FOluiQeKfZo1ltFVc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpHMHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoTPA//XO5imfS2ABhYdOYWWnUlFSES2XriRPmWKLigilvtommkbEDC\r\nGU5SAW//bxQxV0uoGxRmkneFzGHYACqhmSNT2UT9jGHhBfO/Lj2QIYw2O2nY\r\nxQbKRdwTRzKrMewHzZOFzFXh3ojH+kG2MDpAzaQUl9fNJhcut4XpE6wLq0oj\r\nq1d1yIENPYRHPzezanU/+E06DhEBUmDPJGt/MgMqpnGzvtfE4b21KPMuU3VX\r\nv4ADNxT2Q+XTgMbTGoEyrYsAFn94/kdL+Z/JiciHDA8qk/xgLKXVZlnWUYMu\r\nlGevZiMK1WBsCQGSV7YcCvI1lPvKn2bEt5YTNzNb8vTV9UMVTC89Jil9EE5C\r\nH9CCQUsbTRbAEbyNMjS7WH1L09r25xdmnrxQf+nGr6He1gQBAvj5m5o6XeJK\r\naRBs/MEedIjMWDfgh86yCRfAVFNh1hgvV81V5BHM74rt+Tuh9gFXw5riAx2B\r\nyzsWjPs2MsUx12j57ZHCRAH21ptyJpSNuSjxiO2F/pMnHxrNjXc6veSviwFT\r\njBICbXFziXXsLSnYZgtJawEkG2KR5sHfH5bQ7NUdVrhElHGkSNUYMw50cw8V\r\nMQ024sdAS+1P5QwwTE0TPTnNPe28HoAuJh3Gw9Y/oYE6/zmxRHvp10YjaIoB\r\ntgzlHihiUmvSXNN1Kc2vW9wKSPydPhUDY7U=\r\n=9hXM\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-pg_0.13.4-b8ae68d_1671721735607_0.051829786200378924"},"_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.4-099a94f":{"name":"drizzle-orm-pg","version":"0.13.4-099a94f","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-099a94f","_integrity":"sha512-aIEn4eAE3yNbR3jEpKUJKhXA/rpkCVDb8hn38qeUHz7SDAjHsGpl6jd2K46Kwrrp/3UmhCWwHFaU9JdOlPxdWg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-aIEn4eAE3yNbR3jEpKUJKhXA/rpkCVDb8hn38qeUHz7SDAjHsGpl6jd2K46Kwrrp/3UmhCWwHFaU9JdOlPxdWg==","shasum":"c3c9c45e4f547e508b7bb6b9386e03e0bcfc8393","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-099a94f.tgz","fileCount":150,"unpackedSize":221974,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD389I/7WwAWoHrjpoJcFc+dTtpZ3PI/YyO5SKrHRS1IgIhAOAP0+NLeVgSIrfKKHVd6hzSRB12D28vqxp3mVHIV2Hk"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpHOHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo1RQ/+NnaxX/n2KOUIcySyDr/EDop5sghNtsLmlirxofWHc8GB0jqm\r\nhMl7U4t7fSvJO+duePLM9GUUpNa/BDY3BkCSH19wwlZJa3HvLZyUAP3uLNhx\r\nVrXDZ9eJX9mHuAOflP7KAHbaVsj4OXbTsGuIgc5YAIInlCiCdVosMrjEOBYe\r\nA6B9OP2cOb7wjNmNCl8Tu3pdir/svJOP+yv4S1P8vHikFYgjjEdIBMbjKgUV\r\n6H5PQtbfKbdM9Y4n+IXkvFCAusRp1z9lrdEB+zRwTQBRRx8Kd7gbcM/ulwDa\r\nlE2JWLtWOeYcyPVNhOnsLqisjwDD1LIrIe4aEA8+Vys/UVuZTg6Q54ERCFZ7\r\niIkJTUTL8WsLzPEX1QNPIAFs6Ibpp0Hq71gxZOrYGsPUkaTz/+fh/bPoc1su\r\n9kJQcs+r1L7Zg//SoBdI6QECvK9SqyJyrC5McBcX/QwGuUofEQA+DXrz1r3v\r\nnReGW9tUqK3c3G8sHcPGFFGmBNIUwpp/9nZuBRByhKdUKeAXXz1FQ8ICE3UH\r\nTCBIEPpVpgJ9AKs9y6bUjGf5iUVEWZvuVUaaNX36hMFICMbouz2T4s+ojxID\r\nVSbJkqwF8qpjWVxChzcvUmtIAA1FxC5bYkamHhDWWVnYb1YDFdTKeIULZb43\r\ny8bCizPPFJC/vvuFhZDMkZw7hSw/MdcrZTo=\r\n=YsQ3\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-pg_0.13.4-099a94f_1671721863653_0.4460000982411043"},"_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.4-a486088":{"name":"drizzle-orm-pg","version":"0.13.4-a486088","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-a486088","_integrity":"sha512-bMx6rGFELY9WHkqG+GfjSevDc81t70ud48UDVfJi2L61ZvuZS8d+69tclndjVFLO+w2yNu0NYisy6kpeDo9UpQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-bMx6rGFELY9WHkqG+GfjSevDc81t70ud48UDVfJi2L61ZvuZS8d+69tclndjVFLO+w2yNu0NYisy6kpeDo9UpQ==","shasum":"75019916126f02b19a470d000ecd8231ccf9e461","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-a486088.tgz","fileCount":150,"unpackedSize":221974,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFy74tNDYEekIX/I5KCV48TBMrA0oNu/jIHtEzp7Om47AiEAlaTYjgaokGQVRxlScagK8ot7ePimQfJZhB3KG2h2CGA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpLvZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoX2RAAhA1+LCKJOCwg4+8+8GerF8n1eS42Q9luHT1v8dpariVzAy9a\r\n9byLBNS6HGvifOoM3bUyc9VQqBv2t/BMaFIphRzF/OCP+1mT3U+bMEoJfMqn\r\n9GSb+BQ9PZ/EDzeT9GiZM2A6jtDrDlAbqS3agcYU7UAliLQjF30QB8TO6IRy\r\npdwnx0FocGZl0ZI2MAe7XeUxF7rMNcXkFIvDDI4vxzkVp8/dWetEfRK2FPOJ\r\nOKKFnyyMN48A9sOZY68s0qZ3h685hYZsRJDBV4f7yu69cekUEUg46iK286OC\r\nVePwLkk+L9hDZf5bW8KyABNGtCLSw+V1EacJtOeQkfv7HDtRy0LpGCXpLNif\r\n8hAA/Lm3ZtF++wFo4osq45BJG4xVq4z3m/8y5a849fyfk75jfl4DoW+fJxNi\r\nmLkw60TvWm9q/h3Tu3U8ejvVkf0E+2fQKcKO/ihqPjG6xRgFgjnsRZeWuUqe\r\nSCWdJk9VDYIAEJ5JOQ0/jpChZ73XzfH1tH0691iQOUq9m8EdSeIjLSEZYm1d\r\nU5fmmXFrxtIkOPVSyjKCbci2yvKGZeLyxtudiSlDguGtsmNBP36F2sbku1YD\r\n8yu0zWVJIG7hpiuCXP2zzydrpFhqpVCl+zcGh8edty9cjdiDyp7AIFhH9n1B\r\n4iP7sr9LfsPPJeVOZshSlORk15I9Liaisoo=\r\n=uTc1\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-pg_0.13.4-a486088_1671740377427_0.4524493076062652"},"_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.4-d68193c":{"name":"drizzle-orm-pg","version":"0.13.4-d68193c","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-d68193c","_integrity":"sha512-pIisKuuv5a6vQiy+AhEOLX6btj3vOsXwSg5t1IqxLx1nI6vAktBMrFSSF70pEzTyiF8+DcW3QLILcZSjuBAJBw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-pIisKuuv5a6vQiy+AhEOLX6btj3vOsXwSg5t1IqxLx1nI6vAktBMrFSSF70pEzTyiF8+DcW3QLILcZSjuBAJBw==","shasum":"841379e8966aa41185bcded9cc2d176a5ca73127","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-d68193c.tgz","fileCount":150,"unpackedSize":221974,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGHEnAe0skTJ5TiqA8F6z4sKORj4cm4/SqOmIWNRV1VsAiAlMQgPOdEYrnpu81rhv7iJ7fLDK8Ckmgx0eLpbGpUYPw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpL1tACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoVGQ//XlIg8Yecg1FgybzgLOfiim+lvsSTlOQSwykJC7bIJ3UXL5Xu\r\nwsZqqYW1w+vdQ680TVqLvQ6ipEsCuSYx4/Vwf43FiqO4nu0bxMJ20TciO7WH\r\nZL1euH3M+ZoBZ8yB9OQXAZPPk7xVMO1f8kE2BtKmIauJexIYKlOqgEAZHYlu\r\n9e3+kYpVUzWBrDYxjBrRBmpUfG0k2n2M/NcxIJk4WfLIW0v+q7w2rHIhjmVY\r\nirDoL1DkBSMQFNQfiQa5m2ei5wLC1taMbseopWpVB2KD5FVpm8wVq4F0L2Ob\r\nwdPPCNOnxrmNg7y26TD5epHJdSnDsC+AW6TeiPIB7q8qLUqDqjMojPejCiN1\r\nBZXL25DBwHwgmeQG5AgjcBvQYQZNB7DFcIdAn2SPFO0eL54l/oOQdjLEuePD\r\nVuvj8KLhrJRnOingvUGkdms/jIno+6pu+FtAAHZlgBd4dh6FOIbtTQhjmeyZ\r\nd1PQIF1X97VcQL0T+03LxeKfmcCewOp2DN6M4iYuK5NThRfOBtn2dV3YNXpe\r\nK5uw5P9hDJgeeGC5yYV4KBerOLNYhfyyc4j0E3DsMSIbzIg+ZffTOA80uzQa\r\nmjgiuzg++qyBy17QYylYY9OAnHLM08RVs0aeqTOXgzKvLoqgx03uIq7fp9pT\r\nAne+ZZDpkUe5YnT31qzUTeDZLkYu81E4crk=\r\n=ivLJ\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-pg_0.13.4-d68193c_1671740781101_0.6632787051550935"},"_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.4-671a09e":{"name":"drizzle-orm-pg","version":"0.13.4-671a09e","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.13 <0.14","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"## DrizzleORM [PostgreSQL]\r\nDrizzleORM is a TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \r\nHere you can find extensive docs for PostgreSQL module.\r\n\r\n### Installation\r\n```bash\r\n// postgresql\r\nnpm install drizzle-orm drizzle-orm-pg\r\nnpm install -D drizzle-kit\r\n```\r\n\r\n### SQL schema declaration\r\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.\r\n```\r\n📦project\r\n ├ 📂src\r\n │ ├ 📂data\r\n │ │ └ 📜schema.ts\r\n │ └ ...\r\n ├ ...\r\n └ 📜package.json\r\n \r\n## or multiple schema files\r\n├ 📂data\r\n  ├ 📜users.ts\r\n  ├ 📜countries.ts\r\n  ├ 📜cities.ts\r\n  ├ 📜products.ts\r\n  ├ 📜clients.ts\r\n  ├ 📜enums.ts\r\n  └ 📜etc.ts\r\n```\r\n\r\n### Quick start\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\nconst users = await db.select(users);\r\n```\r\n\r\n### Connecting to database\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://postgres:password@127.0.0.1:5432/postgres\" });\r\nconst pool = new Pool({\r\n  host: \"127.0.0.1\",\r\n  port: 5432,\r\n  user: \"postgres\",\r\n  password: \"password\",\r\n  database: \"db_name\",\r\n});\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n```\r\n\r\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).\r\n```typescript\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \r\n\"popular\"]);\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", 256),\r\n  }, (table) => ({\r\n    nameIndex: index(\"name_idx\", table.name, { unique: true });\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", 256),\r\n  countryId: integer(\"country_id\").references(() => countries.id),\r\n  popularity: popularityEnum(\"popularity\"),\r\n})\r\n```\r\n\r\nDatabase and table entity types\r\n```typescript\r\nimport { PgConnector, PgDatabase, pgTable, InferModel, serial, text, varchar } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n})\r\n\r\nexport type User = InferModel<typeof users> // return type when queried\r\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\r\n...\r\n\r\nconst connector = new PgConnector(pool);\r\nconst db: PgDatabase = await connector.connect();\r\n\r\nconst result: User[] = await db.select(users)\r\n\r\nconst insertUser = (user: InsertUser) => {\r\n  return db.insert(users).values(user)\r\n}\r\n```\r\n\r\n\r\nThe list of all column types. You can also create custom types - !!see here!!.\r\n```typescript\r\nexport const popularityEnum = pgEnum(\"popularity\", [\"unknown\", \"known\", \"popular\"]);\r\npopularityEnum(\"column_name\") // declare enum column\r\n\r\nsmallint(\"...\")\r\ninteger(\"...\")\r\nbigint(\"...\", { mode: \"number\" | \"bigint\" })\r\n\r\nboolean(\"...\")\r\ntext(\"...\");\r\ntext<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\");\r\nvarchar<\"one\" | \"two\" | \"three\">(\"...\");\r\nvarchar(\"...\", { length: 256 }); // with length limit\r\n\r\nserial(\"...\");\r\nbigserial(\"...\", { mode: \"number\" | \"bigint\" });\r\n\r\ndecimal(\"...\", { precision: 100, scale: 2 });\r\nnumeric(\"...\", { precision: 100, scale: 2 });\r\n\r\nreal(\"...\")\r\ndoublePrecision(\"...\")\r\n\r\njson<...>(\"...\");\r\njson<string[]>(\"...\");\r\njsonb<...>(\"...\");\r\njsonb<string[]>(\"...\");\r\n\r\ntime(\"...\")\r\ntime(\"...\", { precision: 6, withTimezone: true })\r\ntimestamp(\"...\")\r\ntimestamp(\"...\", { mode: \"date\" | \"string\", precision: 0..6, withTimezone: true })\r\ntimestamp(\"...\").defaultNow()\r\ndate(\"...\")\r\ndate(\"...\", { mode: \"string\" | \"date\" })\r\ninterval(\"...\")\r\ninterval(\"...\", { fields: \"day\" | \"month\" | \"...\" , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\n```\r\n\r\nDeclaring indexes and foreign keys\r\n```typescript\r\nimport { foreignKey, index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const countries = pgTable(\"countries\", {\r\n    id: serial(\"id\").primaryKey(),\r\n    name: varchar(\"name\", { length: 256 }),\r\n    population: integer(\"population\"),\r\n  }, (table) => ({\r\n    nameIdx: index(\"name_idx\", table.name), // one column\r\n    namePopulationIdx: index(\"name_population_idx\", [table.name, table.population]), // multiple columns\r\n    uniqueIdx: index(\"unique_idx\", table.name, { unique: true }), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: varchar(\"name\", { length: 256 }),\r\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\r\n  countryName: varchar(\"country_id\"),\r\n}, (table) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [table.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [table.countryId, table.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// list of all index params\r\nunique?: boolean;\r\nconcurrently?: boolean;\r\nonly?: boolean;\r\nusing?: sql``; // sql expression\r\norder?: 'asc' | 'desc';\r\nnulls?: 'first' | 'last';\r\nwhere?: sql``; // sql expression\r\n```\r\n\r\n### Create Read Update Delete\r\nQuerying, sorting and filtering. We also support partial select.\r\n```typescript\r\n...\r\nimport { PgConnector, pgTable, serial, text, varchar } from \"drizzle-orm-pg\";\r\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"full_name\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, \"Dan\")));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(exressions: Expr[])\r\nor(exressions: Expr[])\r\n```\r\n\r\nInserting\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  createdAt: timestamp(\"created_at\"),\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nawait db.insert(users\r\n  .values({\r\n    name: \"Andrew\",\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ));\r\n\r\nawait db.insert(users)\r\n  .values(...[\r\n    {\r\n      name: \"Andrew\",\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: \"Dan\",\r\n      createdAt: new Date(),\r\n    },\r\n  ]);\r\n```\r\n\r\nUpdate and Delete\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(usersTable.name, 'Dan'));\r\n\t\r\nawait db.delete(users)\r\n  .where(eq(usersTable.name, 'Dan'));\r\n```\r\n\r\n### Joins\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n### Many-to-one\r\n```typescript\r\nimport { PgConnector, pgTable, serial, text, timestamp } from \"drizzle-orm-pg\";\r\n\r\nconst cities = pgTable(\"cities\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n  cityId: integer(\"city_id\").references(() => cities.id)\r\n});\r\n\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId))\r\n```\r\n\r\n### Many-to-many\r\n```typescript\r\nconst users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst chatGroups = pgTable(\"chat_groups\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  name: text(\"name\"),\r\n});\r\n\r\nconst usersToChatGroups = pgTable(\"usersToChatGroups\", {\r\n  userId: integer(\"user_id\").notNull().references(() => users.id),\r\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\r\n});\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\n// querying user group with id 1 and all the participants(users)\r\ndb.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n### Join aliases and selfjoins\r\n```typescript\r\nimport { ..., alias } from \"drizzle-orm-pg\";\r\n\r\nexport const files = pgTable(\"folders\", {\r\n  name: text(\"name\").notNull(),\r\n  parent: text(\"parent_folder\")\r\n})\r\n\r\n...\r\nconst connector = new PgConnector(...);\r\nconst db = await connector.connect();\r\n\r\nconst nestedFiles = alias(files, \"nested_files\");\r\n\r\nawait db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, \"/\"));\r\n// will return files and folers and nested files for each folder at root dir\r\n```\r\n\r\n### Join using partial field select\r\nJoin Cities with Users getting only needed fields form request\r\n```typescript\r\nawait db.select(cities).fields({\r\n  id: cities.id,\r\n  cityName: cities.name\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Migrations\r\n### Automatic SQL migrations generation with drizzle-kit\r\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.\\\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from \"drizzle-orm-pg\";\r\n\r\nexport const users = pgTable(\"users\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  fullName: varchar(\"full_name\", { length: 256 }),\r\n}, (table)=>({\r\n  nameIdx: index(\"name_idx\", table.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable(\"auth_otp\", {\r\n  id: serial(\"id\").primaryKey(),\r\n  phone: varchar(\"phone\", { length: 256 }),\r\n  userId: integer(\"user_id\").references(() => users.id),\r\n}\r\n```\r\nIt will generate:\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"phone\" character varying(256),\r\n\t\"user_id\" INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t\"id\" SERIAL PRIMARY KEY,\r\n\t\"full_name\" character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n```typescript\r\nimport { PgConnector } from \"drizzle-orm-pg\";\r\nimport { Pool } from \"pg\";\r\n\r\nconst pool = new Pool({ connectionString: \"postgres://user:password@host:port/db\" });\r\nconst connector = new PgConnector(pool);\r\nconst db = await connector.connect();\r\n\r\n// this will automatically run needed migrations on the database\r\nawait connector.migrate({ migrationsFolder: \"./drizzle\" })\r\n```\r\n\r\n## Raw query usage\r\n#### If you have some complex queries to execute and drizzle-orm can't handle them yet, then you could use `rawQuery` execution\r\n\r\n##### Execute custom raw query\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<any> = await db.execute(sql`SELECT * FROM users WHERE user.id = ${userId}`)\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.13.4-671a09e","_integrity":"sha512-N6RAqJNQCaneALFJjZLXiT1oci5kqRrpCYdXenxFwPHoK7OCnv18MHdfu0kOkNfzhlNgLhq84w4M+taAZ149hQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-N6RAqJNQCaneALFJjZLXiT1oci5kqRrpCYdXenxFwPHoK7OCnv18MHdfu0kOkNfzhlNgLhq84w4M+taAZ149hQ==","shasum":"c8b6de0050e2ad157e89ca4a7744384b257f0efa","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.13.4-671a09e.tgz","fileCount":150,"unpackedSize":221974,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEj6VrawrqMX3VUoDOhxxpi8wNuqcLzG8L839Pl1JsHgAiEAs+0piQMNHpRw8yHNXWhaPw4q38Kn9iKdy8inkpgHP8w="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpMAPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpiEA/+Pjt18JLBwEFv6HNulZr5XJj0AN4s/FmSw+nPuz6zWrQOjC/V\r\nIu71w3TqH3kTzc0WwpkB112xCFb8irUhEyzgEPYR2Aaek3kv9GL0sESYTXFu\r\nYibumquzQXX7xr1CPQdQZ2WDvpVdUMUlOaCtY/2gvUwBzyCgzPIbLEPOWf5w\r\nN2MJBvNYl+/adlI9QYgbbRATQOxiM5KcbH80oj8qTgVjU10RjtYyOF9QVzeD\r\nllBuRi8rVIyg5tU5Beha/CbDD6k/Qvc0RN7l480a3jwpHia8GWX9+nrW9QZQ\r\nuR/CoXbZuxPeXe21LDapgs8l2WZ+Og04cHs2gZjUrEOVppExFBp3uvgHi/Bk\r\n/3U3bxKDjx4uP5RsiNrXtmD9ZRlTyogYC1MyR7jqjIg2EiorxXQQKrV8bbKm\r\nsvprOx6ukHmYYKNYEp0YyyXEgqLm18nd+O4hKAQ1bAOHaRKDxlsZMaVeSsr4\r\nfirdN7t5AzSCS4tOV8G9kSgRDv+pQA3CgSzlYgF857ZeBO+4S4AZygpJ6dzg\r\n21JAXzhosHKRnbwf0TxeMPrZHVCq0vbkZypL31ZYtNuQDX3PukE1PFKSYg8t\r\nWWKCGTu3nVEQ+U1xK3WBaI3V6bj+WcVJ346CiqSAJ39a3hJH427RIwyavbt9\r\n+EbkP+liPexyBQjYT6zUsz3Dxsji5T0XabE=\r\n=gJNk\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-pg_0.13.4-671a09e_1671741455046_0.9198649307850377"},"_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-5b14ef4":{"name":"drizzle-orm-pg","version":"0.14.3-5b14ef4","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-5b14ef4","_integrity":"sha512-IYrDyPafl6eyVRYLGAc0/F1a4Q38MzYolwLzrXOP7qMQFgUQsM88rFzBXsUVJZ7nCnu25kykhQxvoHgzrk5xLA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-IYrDyPafl6eyVRYLGAc0/F1a4Q38MzYolwLzrXOP7qMQFgUQsM88rFzBXsUVJZ7nCnu25kykhQxvoHgzrk5xLA==","shasum":"b88f2860ad9898792f566499941218e66adcbd94","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-5b14ef4.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmSWOFLufYMPGa+4fvVVeGRfl9HSOmbNBvJqnVFWis4AIhAJDAWhEaV7n34d87yWNu7BLTxcRkSUrltMrTKIfX5NL6"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpMXRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr/7BAAkdm+lKTt95LMCcJUm/noP6jyB3oQ+yD0y980U234+Ms66Lds\r\nNIorz9gfRCovR1iMilcyDCJ799VmqOcoI3FumbHaIyAkBF8SF6DCOOH9KTTT\r\nlF6NBCEaPj6LasORDbHUrjtQAHiEIzOs2a/FUm4yN3Qk7zpD/joPUiWwF06R\r\nwqZX7Yk6mK8dbAVWGs3h/0uKlQiNwDQvFTMEmlJc3PZ/Zp5njfkM8CUfI2iD\r\nwQcip9pOEOrhZm8dsV+aPhHoCew1dHNxXbNyn5HaA832SmcRbQHkgWNJtstl\r\nMjLClP+Fenwid1XGEPFyb3/m1yN1tXdBeATXIH9lCp2b1D1zFlCLHcsH6vOs\r\nSxCTXvpgY9kGJ99K+wMej7J/ErHdgIWzbPuP2h7h1vZL5ycho3ytSRUe5RjX\r\nZhuhlVykaVwbDebhaBx/zGTqQJQNXpYwxvBaH6EUKoE1hXLS7tY5+Wry9A4/\r\nkr9LXGoPmgJwYqoSFIEBKJmtiXhoJq+imX+ulvjHJA2M2HKKnL7mmQ1OmMMN\r\nFUO78Y30mvqMgBoIdOiIKpkPbTzmJCgR5915xo5DicHJ1J5ORxnJAf4ky1z5\r\nSaKZ/Y0buanPLysjwqE6018kzVLKCRAqp2O/lCBEy6xL7kX7NQg6ptTalbsg\r\nugPyYtAN0CX6oq8+hOpDf4rwP2/WjiBghRY=\r\n=Uho+\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-pg_0.14.3-5b14ef4_1671742929179_0.10291317480502427"},"_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-pg","version":"0.14.3-9ba6169","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-9ba6169","_integrity":"sha512-kukE93HHv+clnkNKCWrwKaNMkvR50l9H7D+qTUETr+Mn6Aj07hDd9PsXlVHz2Fw4kx+YOD6n0unDFPk9LjAY9Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-kukE93HHv+clnkNKCWrwKaNMkvR50l9H7D+qTUETr+Mn6Aj07hDd9PsXlVHz2Fw4kx+YOD6n0unDFPk9LjAY9Q==","shasum":"3abd9cb8b1f8ad5053e7ec0668bc5274ec0a4980","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-9ba6169.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMkX25Y0MfHJWayAnNBRjNOuX3Pj3ombl4WFY0s3sTmQIgOWaJsQnGuTWr42pVg2t64158ZOsxHrFyi5iYPhUCa4s="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjrXrtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoeuQ/8CZZMrKiW1ogehXiWWgrlmkhMutWuy6QvFFjLu0oP+891ljGX\r\nH66osbMQWinlIesVftqSGzUaRuxPEpUZ85pOgj2taI9/QF0QcCpahoDJbWd2\r\nXZLNJ/6SOfR+g3MGVU5Nd66rb2cEvqoqS8OSLDX+vJ0ELyAzHeO8ahO5sgTD\r\nOS9iw8vtlPKClYR1KTOGwspQZCvZgpnaTGfzEU72+Bf/F0hOlzta/4R+T1Ju\r\nCMt309peRSS357mZ2lVEswSSNtiEx0tTQXOgk1n6Bj2pfaZkI9yOnhJQAcu2\r\nqd6QfEhzS5rtfRFPNgqKbdZUbw05duTDIfoGC53sLxHxYwZvsaWy8okY1jKf\r\nho9XXZ5ZhKPyFwFAPAH/nHjr+xoTh4mNQsELLK1vgTAY+r5TZUn8BUOQDI0R\r\no+gWGabagtVUnaUg9UmwwBAYkYoBW38ks0bqIMHyqkot7rRPQomohLnXU+Sx\r\nd6+/ewTAJ61I1ADz5iyd/6FwkSwn7ict3astLXXLbMmfw0Utgk/19rOzKP4d\r\nS0hvRtKJfdE8wGi2+CAUKAYe/x30wz5Ahy6XfMsHqwhpKqs61Hj/PnXlMBgy\r\njo2at4/CResQ9NcBBYQ6Ruu/OtqqQlR3dl2Z1aFfxL/VQezsS/maAaeknNK6\r\nxkXgS/T3STZ7fgVGupcGziKwI4oz2b5TswY=\r\n=oWfx\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-pg_0.14.3-9ba6169_1672313581622_0.774104777141559"},"_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-5ce7d69":{"name":"drizzle-orm-pg","version":"0.15.0-5ce7d69","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.0-5ce7d69","_integrity":"sha512-HIqYddUt3rotMaptN7rL27hsN1HBcKUAfBybM62+4zNdeznikYh171y9P1RtNFYd/CE3t27mcQb/3fSG7/KMKA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-HIqYddUt3rotMaptN7rL27hsN1HBcKUAfBybM62+4zNdeznikYh171y9P1RtNFYd/CE3t27mcQb/3fSG7/KMKA==","shasum":"e83e36a2d008f00f53d56b5b01fd755e1c3a73b5","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.0-5ce7d69.tgz","fileCount":150,"unpackedSize":223566,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIASy4iDY4Ce0eygTbaVxkx7iSnBwza4guUAV1p/Psr0oAiBtgWnN5mp66hAeJ64G09pQrotjdmWC+yYl5FB54E9T1w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjsyZoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq4HA/+MJF9ycVTFfoD/fHaCMqhrun/a+GEvO0th99dN+zotT54DEpD\r\nCGTaoZAbr9tPhZ0A75LgQQTp3OMpCE2Dvvpcs+kSRg6aG6mnoBX1sC0Wjglv\r\noYJKpCpozZm/WsEE/M/cF6izeErqNNq4LuOHLRMorRhACJTUFX7YBkb5yqrx\r\n9eTMmcx7FxTpkI8lHrfjCrSuiWg7Okb25OhixzBMkrk90kbTU6nTANpkCp6a\r\nzRFccGyPRmldAm13T0OMpG5DEeaKoYSxokFItVuxhAfQy4JlVk1EXGVg2syL\r\nE19nl7BqG7zmV8u4R5V5ONlgbgo9PCe8SKtU7XFgqTFveq2W3wkwBxzmT+FE\r\nCsoclmRxiSdiSzbMDdfguDV23WIk1cDcQ7nzJHIyWj78Q9u+zvs84jdFSuSr\r\nenHCRcqtO4zioD2SJGI12joqPKljSZLE7ey+HJC/dwYOH3gnY2un0bjQFzWy\r\n1RQIvwAlsWpydhbu7f1ZI35sy7oxWnX2hblx88cmLvPAmPJ+7LdgvFB9Dr4n\r\nNrwIkronYcUU//15O40wPd5xnRTBdV/un3yEpprP0clUH6btQrUNyOdwrQXd\r\nBf0onq/U6CY7L2NoxMuiAmBWkYPYssylkXcCBbXnwe1wquAA/lwJ95kniUW6\r\nkHf2Q3mPOeAx1EbUd2Me4V0UZNtRVfhLWJs=\r\n=rOl8\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-pg_0.15.0-5ce7d69_1672685160170_0.7583867980410492"},"_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-4e3a5b9":{"name":"drizzle-orm-pg","version":"0.15.0-4e3a5b9","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.0-4e3a5b9","_integrity":"sha512-OUOF6jUasXcZX3+5gm8gVIMU/S542gn4yyxf01FX2WmYodJqT2O9PorJjBnDOEtpNRukG7eD4PNAqun9vp8ChQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-OUOF6jUasXcZX3+5gm8gVIMU/S542gn4yyxf01FX2WmYodJqT2O9PorJjBnDOEtpNRukG7eD4PNAqun9vp8ChQ==","shasum":"945ecc772ad64c83ae35b617351ec0fa8721d4fb","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.0-4e3a5b9.tgz","fileCount":150,"unpackedSize":223553,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDuSjOxm65FMlGDMTEnb+D/CWCsIVevj48bv/sPYSVtzQIhALHlCax73EiCKfqSE4ORqkb6TFezgaKGkp4xaszI6QGp"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtrVpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpcFw//SmK6UDgeRxL9fHvH6AlivGaWiSld4EvBz0U1yWd5kBk150px\r\nvJ2JIPBZ4Lu2qxmNnc7l9zz2+l1P+PU8PQBT0QiS9/OLggACkTEijhZdhDLA\r\nmrQcabhcPy5f3xSwba91pv6z3qbE9RPnlHENQBeJLfqt/BmvjHnYDMvA6XaP\r\n3Fl3Ze4ti2uFElX/zRXtti/hpDgIY+7CscBUDXg7Dt/IW97+Uus1cxBv2HUA\r\nDzDA+eHhb8/sLKCoWt+VDiX9EvdoVberec22Y/5rQ7QMzbd9Adu8frh0h4tj\r\nEDDlm3GeKcpYyxv5VObL3LO4gJxDhrohu/125ImpGoRnVZ2QJ5Vw9+2ELfZJ\r\nP9QxwbH2pCtyhZTUxOZEfe9b2SMR/3kv2AnAweMwQrKyPql3LW8DqapaD/FP\r\nK7/alq5mCmWNwLA/cdWAS1Q9kmuOV8tsckTSCYh8WwfZChoHmFVtkcFDFQQG\r\nCoD9gF0/iFTNIFA8UUusX289gJJYv+ZRb5RUUwhjQvPht2s5SZ/tegmIWUdH\r\nK5vluQlk4H3ZrvvqvFPgdMqyGXhUPCERw+Js1nNo0ySoPbMli/gXkDJipADH\r\npdrMQSVURtO/o8l6i+DunTGLfWZfELc2LDbl2lI/4L0OdAwmR52ve6dRWnkL\r\nV/SVcVr0lGvkbjnk8aQOVJvxyR+J/Kplogo=\r\n=Qkjm\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-pg_0.15.0-4e3a5b9_1672918377580_0.38741668041713506"},"_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-dd27c86":{"name":"drizzle-orm-pg","version":"0.15.0-dd27c86","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.0-dd27c86","_integrity":"sha512-VjKQeX4rdfKrxB8gmpOBuGBtgj7EsD08IMx55Sc/yOEWv+IV7nD7Vrm/qLmVic9j0bYUNzgqXXSaD4etgnkr9w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-VjKQeX4rdfKrxB8gmpOBuGBtgj7EsD08IMx55Sc/yOEWv+IV7nD7Vrm/qLmVic9j0bYUNzgqXXSaD4etgnkr9w==","shasum":"ead51fd8ad39853731f972cc5d9a4c8d4c70ddb2","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.0-dd27c86.tgz","fileCount":150,"unpackedSize":223553,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC5pBRb95xSMiewek8vdg3OUSJlkFAP6cmT69XVFFjpoAiEAtbkKw3r9CjxHEx7Nym2iN5SsJiXWOaXRyOgKyYODBgk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtuwIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqsUQ/7BD0ArW4DP97FxfJMIk+Qfr5q32TpYdXTGhib1KgRu9HvkyKa\r\ndn4q5TaRvSm8UrZd4kJLUOEObCh/ZkfXpKdUauZF4wo+UpLczm1XkkGH7ciL\r\nsVu2tvKSVzhgIYGUQn0WDWufYryeeg3LuG+W6IRv6MupIaM7zQMSiBK4L023\r\n8f6ewbbW9dL/LVn63gKdIkpT0xSNstsQTQCOC/PXZJWCPUyGemc6Ay688IHt\r\nVa7yL2ySXKoqRQ8yY96bM1+5oT+o/E2MsWqLdhVZAmbE1ML05iYMuGyPGHzj\r\ns6EkRTMkqeJt5wBeMhddfTAJUEXGgnjb69CP3i8Bba4gp5Y2FV226X+PokQh\r\nQzIM+VGrm9uos8IV08n7YOoYndVedCmb32Pwz2w1NHhtWZ9mjfHx/fnZfX2X\r\nIJ2eVK0ljiVXvFiTwJtKl+ZQsRYCXhqUv59+4Tz5oFSprtGwKeav25meN3Wc\r\nVMrHhEaEyR+eyGT2f0f3CGPj+SJUhOyPPzH3GIoyrQIPpw6SBnLSzXrSDJY+\r\nWYFUhGmSVSEBk1QNPewUsgcpOBbE1ZvpgXTg3hoVo3cdRHne9rEroUxZ+Bxm\r\nHSnPztOkj5y44yl+6wDvoxVNHgEKv1MMjvXKfFOp3kyfJJRfz/H/qQ45C3DS\r\nnd1UgdTWFnnCoDJxGFyn8pIelHFFftX1RXg=\r\n=cIEK\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-pg_0.15.0-dd27c86_1672932360232_0.11479306459088523"},"_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-67805d4":{"name":"drizzle-orm-pg","version":"0.15.0-67805d4","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.0-67805d4","_integrity":"sha512-CMmQ/rpS2e7DxPVbePhVkU778QVIEpNTwwVamzWquxns6qHDl/qvVYZAPwE7lWrRNcjWDPxqLCHnHGpED/UcGA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-CMmQ/rpS2e7DxPVbePhVkU778QVIEpNTwwVamzWquxns6qHDl/qvVYZAPwE7lWrRNcjWDPxqLCHnHGpED/UcGA==","shasum":"e601169883b9304fe526c7d9cbf435af35571f97","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.0-67805d4.tgz","fileCount":150,"unpackedSize":223571,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQMHS54gdE97L6X7eE6F9t4ZQ+j+hKmiPUNJI/+cfkYwIhALc+Ycy752mxW3ma+IgSA4+3Bq364nnpZwndTQo9e8M/"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtu4FACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpYvw/+Iz8NIPkqHTxnnWl3FS8N5KSZtXPjH9oj32iq1RawRrXGPwSS\r\nuuD7wy32ZKnGltzwuYtyCvR94sprNtHAbm+1OaYLxpIRdF6du3dnsfGZ+Jq5\r\nn7n16t8yjIIqZ7mPQD6UWycf/nGzAVGxCuXLtouHqkPJ6dR0i/4uLgTMwwFK\r\nO4NOq5Lkdp7TkuyKkLeHYPBXnHG1VSm7IZI/sTLpA8Xpv4psuUTx20IkQI7V\r\njCkkZyvkOFdRQl7Bm1jdqFH+W9dhHTXBma50eg5O/bLIofTovc3Kz4hMNle6\r\nvnxDWk/zlc9EI/2XEIQYdF5iHyHZ7/na2fFrD2wxm0eqTEXrr2yED3G7FLEo\r\nISE0pM0ugId+qBQ3K7G3Mm/QbKbyJM2OwOYKpgSlDNeY1rZCzWNlVLQO/ys+\r\n3BxJ2qB47XmmC2aWU3KLT4kJaPZ8gUOE18qs+OX3Rp54SQOhiOPE8a/hXA9F\r\nocLggIQamsSTpBPhWpgesFYgt0rdFL+ymjRDNwmS65LlRokw1qKvgxnm9U7G\r\n/PIp5Lh4zwjEq9yew3+jTkGJ8fPHt0T6/18oVNpHyG6SLEKEk5dnSxKfneKc\r\n9XosApTecmeHQTJEXI7YlseliH8HOqW6SuLwiLpqAllIFWvhQSYGKRqm0zZh\r\ntJoD3WlWhJrP+qIxFwXoWk90lkhK8bJ6B0A=\r\n=c73E\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-pg_0.15.0-67805d4_1672932869251_0.12789623828092345"},"_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-1bcee50":{"name":"drizzle-orm-pg","version":"0.14.3-1bcee50","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.3-1bcee50","_integrity":"sha512-VDIy4cofQZp4mOTVx/rnoJWJgC1Y7popPp6JwJ2iRy7V9WKOavNEyIqu/C6REssMWFPKGkUW49pIalaCSe0sqg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-VDIy4cofQZp4mOTVx/rnoJWJgC1Y7popPp6JwJ2iRy7V9WKOavNEyIqu/C6REssMWFPKGkUW49pIalaCSe0sqg==","shasum":"8673b2b342939df8ebf3a4d46d39a783731efb0e","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.3-1bcee50.tgz","fileCount":150,"unpackedSize":223041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCjOzZB7TrMlKu1bc+Noikz7KBkvuJ71FfxP/+S+znWEgIgYsaO85WSfQIOdz35+BCWT01uIq2KAIK+4n46JlNQKN8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtyazACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmogPg/8DU6TfGKGyPw2fptSh9w44uZv/h1/6fHaQbJY5TFjeV9Epkwd\r\nd/AZyjM4VVmIKrTzR0VkPLHh8W27P6wW8HtilJlagoMte5bdkPz4sTWNBAXj\r\nFmnWxgPYkNF76T4qghWGsrvpdk+1dFSjqXTyrOPBEWTAd0dx+NagpjY2ze2b\r\nOgU2QN6LUf5u6TCT1Vz/PxuRu6U6MH82CUNQcYPrit/S4KIjAdlp3CXn3SVK\r\nP2FX2KkDzvqNT4ej8oeox8B5lk1hy9fJtWEE/NR7byAVRQ9llPoYiaGJlVnq\r\nUu/qrVlcp7iAp50Egi5t+xPTG+fVE/F4+5xp/ovzIAq2Y1AmJQ0jtrWrPrM7\r\nRFqLEbvobxINg/XpCvtKUb2bmmlts1twtw+3nlSnuM0mg67EU+Pi7yGQoP9I\r\nS/Ymqwr596zdH73p8FBsHNlgpPmpFNVtgkOYjGb5EENFHxY+xiGMCmJNPj5X\r\nbVp+2j6jH05drT3GftT2x3oMxlZvDw9jbWyG4SpeVwF/mktkaBtCfbxfu2zH\r\nw4xAuvg/r9JK7Gzy7LkW2AeLcHN8oYEyFuOxjdVt9ugS5HFqpaSQkT/PMHIc\r\nJfCa4TO/CD+LQ5RfwjMA0rSLz6Q7cEYesW+2Vx1A/E7Niqk7lnYdO5O0cH0Q\r\nquPVpokoEtEt5cFtqS3fBWKTuj5rMNjVNCA=\r\n=a8Tj\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-pg_0.14.3-1bcee50_1672947378839_0.45175293609762424"},"_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-pg","version":"0.15.0-07f606f","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.0-07f606f","_integrity":"sha512-A01XhTELwOkcdLvx8Narttys2HtFxvIEdhJJDvMvxia2Djz62tYugwZo0xGplzB/AdyStICCH1HDjhz8ks7mTg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-A01XhTELwOkcdLvx8Narttys2HtFxvIEdhJJDvMvxia2Djz62tYugwZo0xGplzB/AdyStICCH1HDjhz8ks7mTg==","shasum":"a19098e05708f9997f49aea6d7d5805d9cebe3d6","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.0-07f606f.tgz","fileCount":150,"unpackedSize":223436,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBXEKxH+OHUE9zzDlMA3Q8/a0+yOqBob/d2ULm75wgPLAiBPdxWNBvr6AQLprJphS8p8TgdnyAHGAEYuOpwGoDWwRw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjuDDKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqj6w/9EQJHo8V2M9EATj+UVTFgjzBzoy83bLH3rcwUC+FbGTT49/eH\r\nr6vUXd2fDqpgcS2Uo8FcpPHvXpVH+zT/jDYPONhC+7aYknAD+7lIL/K/cyER\r\nBJ7CP9Lv4m91O9h+hB/PCLwXN013GhwZcO9imEe5XF4KY5wTeuKgIdWipAGk\r\nEHYprT2FRfKAZXnMuaT/+yr+rYvE+MlZN9PI/mppmkl6bOyUuF0UX2dvUlux\r\nFzQEfGtwJuyAqEEsRGlm39Px1Xv45ugG9YdfNaOMUoKGCwL6GKc2q1mUbfve\r\nOPJq4CfBezzC9kct9pIdubEzr7JDkHSyTIMwIJmmHmGJUiNnKIoBeYZn/+j6\r\nGVtE8JmLO3vZke9GLAFqmOrJ6453pXhpRaC1s0wktwO3bqJ1SN2xcX813+VZ\r\ndckXXYxtv93d4uLihGX3iBGPuRFO6JZ5M0rThp5AWCW67voLP/cxoJ+Iz+lS\r\nnwV/p2o7P8VuWAcUBVgS7NwO1PZcaIJEBVsrRPlL/Q2thqmh9MK15gZr1UBG\r\nb1shz/Y/7TJ4eWjD5l+09bKz5mOxoxH5zfmJ/nPe0Wqg9nH0X+Vd9o7Z9nEt\r\nBpyugSAIVLPKZcWc17shOJRbjIYbhcnZ7rX4saALNbXkEiE9/YB9aRljCy5x\r\nYl61J+AffAxZ1MPfzjypxJu+N5aDY7tCwzI=\r\n=5P60\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-pg_0.15.0-07f606f_1673015498071_0.11157447002905085"},"_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-pg","version":"0.15.0-a90d3bc","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.0-a90d3bc","_integrity":"sha512-L1AckHkoEpXDaRF5E4IXYpJsTPh74mJPQpQP8hB5GwtYxiLg4MEtrXcKD6tOx4OEaTK5NznxBu0IhSaBmr/XmQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-L1AckHkoEpXDaRF5E4IXYpJsTPh74mJPQpQP8hB5GwtYxiLg4MEtrXcKD6tOx4OEaTK5NznxBu0IhSaBmr/XmQ==","shasum":"4962c6208413d9fed61a23d45d13fcd680e26807","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.0-a90d3bc.tgz","fileCount":150,"unpackedSize":223454,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFTtAUp/sSDPw6VAWHx31ab8xj/fMQ+UUOqalZKrefu2AiEAt9oPCcZ8f68+VGoJmkAgBcgvg9EAOfjYt1gCHkR+e3M="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjuHB4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpjdA/9F76MNoRA6Q/6B+JBdFiy4T7XdFybiJC8mHwDbPhkzWn7ngzW\r\n1PdwRIsxY0K4ov1QlEdqCWlpSljPOSoeVWdrUUA/BljbNJBgonJAlPnSsT5j\r\nU0kl0ao1wuzHQn59BIXHlSY0oxZcOawGUEVJg5RQTp68RpncuORP6fuq90y8\r\nConwtcITZZaCKtyhWPjXGAifQth56Fw37SPp1s2++syFCkBsvakYjoyE4mhI\r\nqqkQzexTJzJsmLktZdBJlVzn79zwdH2oi0/x4ft7OqDx8eMmGClnOMrGLbph\r\nvlGrQFbVx2NETyeFY3JAslGJja427m9IeQowfooK4gnZBCOd71HsWBpKs3Oe\r\no0BHWbT3OO1H//Cly/lh4YoRl+aFwOHoOvUFO/YGqRXsUJ2oNeIfANdJd3+7\r\ngZs0uQqOuxaAbvGMszQ9I14HBp+yxH+ddnfq39ffdTc98rHlvhvdnMuJ1Mk8\r\n3FP/AhMBcpn5KjAtd5q5EGoVsLaeoeplrhnkzSxokM28amIDz4O61QO6LNsv\r\nIovujsCXEh9coU5eJY+KkzfmkBEHr53JD8DaxoolOuVPIHEsUlZy8z/KGzwu\r\ntIo869l7fXx1tjUwTd3m7SsXX3gMMxN0+ZhYHaxc8AhfB8tn53G50X6jJAiA\r\nBN4QLb5xyIo/lsK10c9cc1vFeFCE1/ZxiNA=\r\n=BVIC\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-pg_0.15.0-a90d3bc_1673031799805_0.8235418494838365"},"_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-pg","version":"0.15.0-7d17618","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.0-7d17618","_integrity":"sha512-Sg5cXiYvl5ewD2uMa8QmWAiE+2NvzdDaTtBHXysXoABeJXh2IsAAgK6SuaEUpTcaBIT7ABdaDcR7VfFkfvZHAQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Sg5cXiYvl5ewD2uMa8QmWAiE+2NvzdDaTtBHXysXoABeJXh2IsAAgK6SuaEUpTcaBIT7ABdaDcR7VfFkfvZHAQ==","shasum":"3c1722c21a4235c34207b8951452121718021665","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.0-7d17618.tgz","fileCount":150,"unpackedSize":223454,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDktbidSiGHpUMAg8lMQwVcz7QZ6aEhTcMn3PIuhHVaTAIhAIsRp+y9ebRlkUGMzVoYwUvwQRTaED78YdQW45jyBoLa"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjutP1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoWUw/8CzmPSNV9J9tkaamRrLdfsfRN6QLShHzPuvIKl1jQFnzYMXBZ\r\nPxrmQPqczJVlEQkG8STWljkNOZWcaQaYNwrOfnQrRdOQq6MpS19Scz1UlFky\r\nlHTp6Mco9Bmo056p2OyL8m8AtaCdM8dgFguNrt6N/mO5PuLT/PPJwXvKGdW1\r\nHUAA4rbQrhD/PmMDKDzAYxJ+srKBrCEeBAaGvsnEgEplXkKxIaVzW7OPWoMS\r\nOuWrLoYpLAuuMoXxs5vMJdTbJUF9JrP1bsa2ZvWWCFovfKEzcLMISRh0umIu\r\n7p9JLhhAJAXWVvbqvjwZF95bTcxB9XcFhYmycdTRaT4NCdRmeg/UPqFXxcc0\r\n5qMtwnZa2tZ9dks5RLneTZt3lgV7n3W8WtF4qFE5VRYyviNehx+e/iJIpdOr\r\n7pURh7sGkd1V+idIVpobACOFU8lvMrZCn6QNyPQniEldzwe4srTJPrLkPXtQ\r\nkdcNrmMTRb2pOzxDHg81TDNagrVxruigGgw35YR/Hd3xITFTsoUp3O6qTj7J\r\nFuroWJ8utHQ33WGv0PGRHAsVzlxRTP99YEDy/leWokO1TMqskAMacM2tErpH\r\nlxhUHDOmMrIDPhVqqJlwv6Y91E1b78V2V3xQ2n3r6cy0in46N9ZaUYhB44of\r\nuFroUxX74B96hfrZqoWIAOBgLRGfxTn+uNQ=\r\n=FLlu\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-pg_0.15.0-7d17618_1673188340931_0.20835571569278355"},"_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-59f0a3a":{"name":"drizzle-orm-pg","version":"0.14.4-59f0a3a","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey(() => ({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  })),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey(() => ({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  })),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.14.4-59f0a3a","_integrity":"sha512-6r+BaC/1jA9re1HSi6y+jXEF6NoPrvJmTD/VFdIEr+p+lsjq12cJaWtrWcB/AafUMMN6x3TcmnDrjKmePD8u9A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-6r+BaC/1jA9re1HSi6y+jXEF6NoPrvJmTD/VFdIEr+p+lsjq12cJaWtrWcB/AafUMMN6x3TcmnDrjKmePD8u9A==","shasum":"e7f790d7b5d53c93801557ec957e3e858c4bc688","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.4-59f0a3a.tgz","fileCount":150,"unpackedSize":223053,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDNHGY37gX8maI54pkeohOlYeYctzIzz/DmG0HJ7VfKLAIhANQJBr7EOG4OnoxXOdaUNm+u8NyYDg622NGB89SGfVIO"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvCWHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoDdRAAmDxNHoieKcjwRatnqxHhCOF556BxsGfNYHmTUaEmbl1812xp\r\nOCOaHp54t4QTVFcqHOCs5caujVtEJ15htt7yYYLG3O88ZbswWDWa5LI4D+tt\r\nODJH3t9edG0MbO0gAUbniICMJaNpBR9lvZHiROL/zHz5msOLkj0sJCWLDGGW\r\nKG8d022cSx3KTHNL68f90jf11eppZlAWA3yVc+9xAchKFSdeJ5VZM6u/uy3v\r\nlSlP+i9Uz5ktwBlGP8GVWAOTW1N4aq6BDwaGi4gV6xczqLjrCo8grn2axN9N\r\nuyGniLM2ZKXYGmB54QakHjY3cRNZLVOaa2TxImuj6kDcwMxjz/JXBOM9EByd\r\nc3uOVfexMvUOXQqg3ZwSuLaL1mZPYyzElYznEyDkSw1lg/k/CM443byLtxdu\r\nE7UysYajtXZgoGcOqEsGz0ZC8T4eJJp5F6lwneAsQZRoLmiLSzNaQ8Jhd7NM\r\nvSOQVi/TbpFxTH3/ucolu7k8vslRY7lhYTAldoMdwaK5V2aPGc7WugE9ZdMT\r\nq8+f+8g58hjr6XIVu6WlfR0huXlMaHdOHZNwbTNl4TUume+FV4iUmWV0pB+N\r\n1YAcObF5qnTRL+zDdfDDNB8gDvsQeyvVX35/23F8bMqLRkETstvEyTj23bj+\r\nuI94aLuAm1KDb1NwvMC6Q+PmNF3an0JPvt0=\r\n=lt/e\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-pg_0.14.4-59f0a3a_1673274759385_0.8883793363142947"},"_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-pg","version":"0.14.4","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.14 <0.15","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.14.4","_integrity":"sha512-6D/0aU48jYTOZI+cH3mx8SM9lpHhsTaRPg7Jv1bjNQt9Vk0UpWfDidzRK/6+RlikyvuuP1ohShlNr3/pIOspTg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-6D/0aU48jYTOZI+cH3mx8SM9lpHhsTaRPg7Jv1bjNQt9Vk0UpWfDidzRK/6+RlikyvuuP1ohShlNr3/pIOspTg==","shasum":"54940d7bdf0ffe310a5ca4849ee11bba4eae0d5a","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.14.4.tgz","fileCount":150,"unpackedSize":223045,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDFAQYGpttH22NNHW+S/EgPIvEjCrtoknv5fAR13B8CLwIgHFeI6mGczT2mM/z0LtFhmgcZyzGl2HDqHq6R26+sooM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvCZlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrNow/9FiUlE0ys+EwvQ7esWHykUXG8d3xHpdRJE2vzwWpGpI0AItYe\r\n8IKFlI5GZb+TprX2UVMA2p9rEStDTGt498w24paX12zRedhg4jnhve8yFNX5\r\nTWNVBbXN2ekLFJpnhxmv0sb605ww6nLeq//AHrITthHBE62DFnk0bi/09ozM\r\nHMs9OYgFs3t8Cnpft9Q9ZgHBk/x5FKtiutuszozAR82rHZmR34MJK1UGOnfx\r\nFrocEjFRkfDzNJrVE2zK3f0uVY7htcXthFdkVX+chCjY4xI/zyr9UW3y3SN4\r\n0ibHkaWrAoz9JP+h81nwLBExdOEHS3XBP2EmT8u9BA1VVyhQFnoAAeH/SJWV\r\nUbm9iC9vUvhhctq9kR/ZC3KAHUVHUY/V5gGyfrsCLZyWz5nifnZaAHT5lzwk\r\nOs1v8Ds4K1BcilOOlCM53wicClr4x5xNode+kuDZAkpu+fdy0nINSnXsF0ET\r\nEf0ofWHD8D7iTJ/A+XtP2Wyph3rQg0llkvFdP8aiMfIXVZF5PZNzeizhv7o1\r\njkX4W+vzdUSjSurocTaWI5s+86NSkX6WbS0KcMvdq3sNAfKn3p12OS/O8pV8\r\njSMXSYopVigo3vSVdSulMyGp3y2qrNyzoHY7o1I06exxuzQQyF0eg+BMVXvU\r\n67DAs2U3/Bu/ne3NjLePC9k2qvra1BDzZok=\r\n=NMJ7\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-pg_0.14.4_1673274980953_0.02029833027549599"},"_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-pg","version":"0.15.0-2e1e5b2","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.0-2e1e5b2","_integrity":"sha512-tPeL0GcqPq0TNsaLrF82dn2l1ACS8RgsA3b8eqvLP+GiJ4LxXJLooS1CevEc2znwPw6Pl5zNenwOagWJal+/7Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-tPeL0GcqPq0TNsaLrF82dn2l1ACS8RgsA3b8eqvLP+GiJ4LxXJLooS1CevEc2znwPw6Pl5zNenwOagWJal+/7Q==","shasum":"28670ded8a863e050f707fa2f928e41be069725b","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.0-2e1e5b2.tgz","fileCount":150,"unpackedSize":225053,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC9bvXIEIBmEs84wshlS4VTady0E9XbgzpoItiC0C5fVAiAamdzcJhWWkxHDBpOmno+62pM+b29oeP0pQKzrrsa1KQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvUtaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpQ/Q//bwHZxw4jIavCJPhRq0Vw66gbnEnqD2qHZOWlMmF4jc5GuGJ6\r\ncDCBommOeAfhtLeyzOeuVRLgzTyMJ1fAuxiB8V238jPgKpJiGpDwSYvVLb8O\r\nxleSu65uXtjl2ciFKvy+JVJDLPxR5JqUn8lDHcPltTo8bPl2Q4ZnLkmFJlWt\r\njyShmuK64KkCTuERAIfkmoLGXyKtDsCd/6EBqEirlMIdH3CWYt0CMOvk1H9K\r\nysGHNaE0ClQ2ECXDjBdbEy2uuZ9Bvv4G0aiBjhNou5iU32gczqjz1Ylbfhwu\r\nfGiFE8zQzocqYUC7Eri5eIXvjx48x9HF6vsvDN3woEkHzJqBZcn/1xy7P6Tp\r\nb0w5jZzmzG1E7wkdpK6X/e9x7aBI6XRTXm9d17Kt2IYaTm7wG9f03kATzw8W\r\nlan7nWtdFXZWW1lMxZaI5jN76SPx/fkSttBhflTHXKewXpVQzhTl5fY/5bxU\r\nvDz66dNaRcMwsyDjnej6Gd4VU93TWioltQ4tykzOWcLppb7O86coP0jwiQSR\r\nEpDauFfilNJLYY8jB+wXl7Su5hgoAnMUMepZ8nVhwXS1PSuRrsDITaNjV2eG\r\n++n2UMUT+EywqGKNqCJYWTfIIptL7ZfkWcQ8/E+03/U3l3tY7MsBPGkVYBd8\r\nt76oG446kOj7gEdAJXDGOUNKXfxVzROH/7s=\r\n=R/tn\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-pg_0.15.0-2e1e5b2_1673349978488_0.9806681076238617"},"_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-pg","version":"0.15.0-60954a3","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.0-60954a3","_integrity":"sha512-tALVq2S4+QWCOZ0ki4vt1EoTp8zR/k7YYnNfbxy71ZffXK4M7PaH6ZTujv4g+i1H3L5nrM5uojzC+XqULc1ppQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-tALVq2S4+QWCOZ0ki4vt1EoTp8zR/k7YYnNfbxy71ZffXK4M7PaH6ZTujv4g+i1H3L5nrM5uojzC+XqULc1ppQ==","shasum":"1922437ea49ef44326c6a3d760d29c84f61fd609","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.0-60954a3.tgz","fileCount":150,"unpackedSize":225094,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmhNVZDKoWOjCJl1B2hWuqS+RgRgYoUCgE8CsAnajCnAIhAL9C10SU1xDYDJRSMQPfuqoe2/JjVMg+bAYCy5uZg7mg"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvW50ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrrdQ/+I8qlAVEqQvJ1pRNadw4DIFGu/AMw/H4fN3nTdZ+PYd2yxVYF\r\nCvFLz7JbctwSTydwHTOj4ucP9x1RMmduFoL7zP7LWcQVcsSUErLrfGW5gPQK\r\no94S2DVgG7oMhECiNPeetSKmjWgbdUFtWk/NAok/oUSdkm8WpHUWgmvloB/q\r\nnt2kuVyymaZnQwByAnzeBl7NyDcwfFNxT81Mc5u41mN9kfPpHq65cSKThNds\r\nDlMkjOUzn3RO++t9/so74D+iEjpGzgFRGGKTtD9MTTpBWxidOASz3BzpiVER\r\nh0GyE1Ty8uZAeqCsHSO9sWHeFbqnFZxSuFgQhjXT6BdyTlTi8ouzug/aiD5K\r\n/+q/+XTfdwqZKG1G0MNUIF7fYvG/YxpnWQ7J6Pq0ByHOVgcexG0pwPtinoq7\r\nUN2EH5a+yeoNSUBD4mLpwowdZiLYaPdUe381BlrCMiCe+6WtSzELOkjvDN86\r\nPrGpph8OBer+YdJnItRE5nC8w2DU5XXI4yfb/mtwiBvjV1TyfhWnXeyMC8WE\r\n97OQT1XE+mFDoHtf8hWJ1ehG0oPzyB7WfG3LdUNynfmMoPXpLBC0xc/9ASO8\r\nbPZRSoWHQqHJ4IkyYLrkd1Uk1NU6mFCLgmQsZ4/bsOlWkg299EXuy2NBUsV/\r\nJ37//67egZFt0KT19GHycv653wbrQNc+PHY=\r\n=0qiF\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-pg_0.15.0-60954a3_1673358964591_0.9653679209707515"},"_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-pg","version":"0.15.0","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.15.0","_integrity":"sha512-SESpSOIcxdo5B3m8C1SwUmezVkldq5fiMdfs9fpsjq1EIuF89WvEdUX6tw2ld/ZBMLmOAflh3IMoPhgKoyGB3A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-SESpSOIcxdo5B3m8C1SwUmezVkldq5fiMdfs9fpsjq1EIuF89WvEdUX6tw2ld/ZBMLmOAflh3IMoPhgKoyGB3A==","shasum":"68398e9f9a8f64c9fb25ba3a12d5b7ae5a29f4c1","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.0.tgz","fileCount":150,"unpackedSize":225086,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDo4RcR5O3sIsVOU/MFIujnZb3a8bjI0HVnZkfn2cS31AIhAIrsR9FvjCHlajkPzd18UnKXmCdT4uiajTav/1crjJbJ"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvXDhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqPYQ/9GYsmrB9Tx7A4gGBJyzw8mKQBI1LCeL9cS+ZjvIawRf+Im19c\r\nsUVXUQ2jnDUN0rqvQR3c8lJ5zQ31knv9paEmW7wlmH+qfRsmH2xjmPci4Vpe\r\nVqb+zOG+3aMRCCuV62wZaJnxrWLPd4wczZvqjPLGOgDTk7TuRQoiAB2zJfhs\r\nO5am/1IGgSiBvHxKvOwTABill+eLKkSSQVjOCRinCdDZ8zacOfh/Fwf9rbtd\r\n5ZLGE2UIJDRZDACevXOLWVmledLpbAN1cINUqJncwOsl2BXRiChz8YbOjfQ9\r\nA8sJEgf0FFD6l0SU9xs3v9wWM7EjOjKxGqv2GgOPpCRwD8Ov/4wq9z6mbDYS\r\nJwyl8xrhNLCGl27uPQZ5TyMvu84yYSVJWup0vyjVzVT53UH73q064AaE99i2\r\nJSX81K7OgC8EhOt2G6pJi7D73Nko++0mso/X6fHgaCTvR2UvFTVoir4A/zpf\r\nLFqCpqODU5qKXF5/jn4VRLwQmWrkvgZV05xFaHk0yPDIOeP+xv9ldvjeRxuT\r\n6/cqEfmOJaweESgMP1Tg7/+I5w1lXdp1+8T/GhrZO4gKyF+iuwU4oMQ1qPg5\r\nTb4yE1e50EbJZgwFGZH1Pe1jHgeXRR0IRPxkKwNuy4bEwiCgR3HAedV88UP+\r\nH9TzFZ//+voA7McZnPjAOX5adtRWtCD+tyM=\r\n=dLBc\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-pg_0.15.0_1673359584976_0.3090780265792974"},"_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-pg","version":"0.15.0-88523f9","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.0-88523f9","_integrity":"sha512-mkfQhHtNhg6ojtYzeRikhRz14C5Q9sVOQvuEAJr/MmHl2Zl32w6kPfOS2V8oq8CtqnmNautV56kYH0fWbRL69w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-mkfQhHtNhg6ojtYzeRikhRz14C5Q9sVOQvuEAJr/MmHl2Zl32w6kPfOS2V8oq8CtqnmNautV56kYH0fWbRL69w==","shasum":"908deef9ea177a4e9b7ec8d75913a2f64e9b12f9","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.0-88523f9.tgz","fileCount":150,"unpackedSize":227448,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPxQXHg4gvyiUQYFGAPB1UgQFiu1TNN+5ns5a39zZITgIhAJq3a7fQNOFm+V9PKOkb1STXU8dEGlo6TEU6fUDWzUH7"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwBF2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpwqQ//cn9oxwydhCQb6QcZpmVa2Gj4Zwaiolt5zOzegS/zMCzwt7aW\r\nYGMpTUkb+RyGtn+jl5zmFgrft9VTo49TsK7dqeOS4JjtZJaxBgC49Wsv29AR\r\nIxwLALEzsb24eMAL7UPhIulxFReGTQgaWstTgN63c0WBJe7S36/GVycNa0SB\r\nF4m9TtZ92Btj7Za6HudnItHARBjSU6vGuAQvFwcrZAJs0EKlezJrdUdZUuRY\r\nGJTMU1YPJNRbUzQ6/WLYhl3LZXF2mbr2D2YCZTv43eeHEITEKqba/Rouct4O\r\n3K30dvuFUKF9O0ere4OWLTQtslXYu9GZCpTk+3fjwC/W2UngGZN3DUiXho38\r\nfmQgO8Lv9PWhtfgk4oGCvL+HkvI3M0Sfq5xkpEkNscUJd3EZf9VNnfhMHFxm\r\nB9dPejTJUz3tqjU0/9uMLlxRpAYDlyG9iVQ8MofmdOHOwx3IEWu66YmLIoXi\r\nwT2q+SChrIdjiki3BFpf1vwMd5Zd0XuLBu+Qike5uF+26ACBsu6+/WaFVqI5\r\nzCClNfu34G7mbW3cU67jveT5xLs1lsUffDdOn/H7d5h0OjqEVWrbMCBG/Nn/\r\nTQfSdpQ8jUyJVBEnwty0cJF7yCeG031fZkAqrIa4xAxoeHx/QPo9tfUk8SG4\r\nv4apIpUlbP6I9H9g64JwFNiat1ixw6oJfq4=\r\n=Wd10\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-pg_0.15.0-88523f9_1673531766055_0.4105086545089316"},"_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.1-f67dd9d":{"name":"drizzle-orm-pg","version":"0.15.1-f67dd9d","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.1-f67dd9d","_integrity":"sha512-VLpTESyj2SfNTYn52bUFqY8rJR4JQq9qvh9cARxqQOG/jKqfdWje5Ct+ZEZ7jXemmbkSh6jFrpwWYqIviZZ7TA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-VLpTESyj2SfNTYn52bUFqY8rJR4JQq9qvh9cARxqQOG/jKqfdWje5Ct+ZEZ7jXemmbkSh6jFrpwWYqIviZZ7TA==","shasum":"f40c083229c11744edb2ad8600324b1c1efbfee0","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.1-f67dd9d.tgz","fileCount":150,"unpackedSize":228786,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPSODAlEWr5xsa77TJVGPx3y3dXaBnfqT4Fxk//4i3UQIhAKF2eNjmZXF0z+IKIO2CqOkfAjrRYTe97AEG40jmgBQ5"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwBzGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrwdA//UCnloRwjSSAdty6I89cmzli/7+LPS57cBolssvT7B6JaFA1r\r\nhRtxVnKX89Sfa/lKLQylHHrV8wzOBslSYaa/Ri40bwlM0bB7q72zdKGGMM9d\r\n4zVHm4YerSI2rZXEIfD6b/mp4h6x7jUhgHUDxwaw9lit56MHqBhNSitW0kxM\r\nmv0a0pVBTkwfZuATaTxD4W+V11Fw9Us/pHsO3j7BW9Andi+KnPrhGFgUYnXL\r\na+mp2EoXFsZqQMbHQrUQsmhYwzdF9GdcgjAMQOny84/z2fKDrfK5s73v/tWJ\r\nRkQPdcK/QqDkVqJG/epREi6SvWAyvc1UApffDrmpZ8H/6A8ILmeYuYafhCfd\r\ntSPJrIVPDm5C32T4WJ8pnkops3dl9PNl2gq0sMcacgOlUfvWkWwiTfC3qoUF\r\ncUADcdUS0px9soTBRoVis0JbXEBKwytnh5vl7Ji5gFknaARSRxd3bNpuPXim\r\n+QQUguMR1qxB4Tf//a0YmIFBcnazN0vbYrmdTJRnY69PoJY82xpCn9GJa8pz\r\n0X1yNozLAZyHOLIUDdLl0I09DbIKfMiGgEUx1/co6v2IHTdFI0gtGC0Kipn6\r\n+aBZ/53F/nraDvGdgnQB1pMfQg2KZf3EeSzTKXwwDCMBKV9LzQqPfWgyrYHi\r\nGwoWmIW5yoPkpNbjNg6u2jFOihhgt28ydiY=\r\n=WTnu\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-pg_0.15.1-f67dd9d_1673534662377_0.17348535955895739"},"_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.1-80901ff":{"name":"drizzle-orm-pg","version":"0.15.1-80901ff","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.1-80901ff","_integrity":"sha512-3E/Rj1PNvMtBzhdx37AA5YfHpdA/3VBNzVZHCMuabdO+XZCbOGP8qoVsUO5zLlS//lJkuNKB08nk6ImgYPtR+Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-3E/Rj1PNvMtBzhdx37AA5YfHpdA/3VBNzVZHCMuabdO+XZCbOGP8qoVsUO5zLlS//lJkuNKB08nk6ImgYPtR+Q==","shasum":"62bc19f5cbca88198964e3270b6a5ab8c1ade69b","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.1-80901ff.tgz","fileCount":150,"unpackedSize":228786,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnV7n7UWqTnpnzQJzsUXjF+8u6yTYXR5Okg7/DU5JXSgIgX1IpoA/PV/c8EcHxvuGlhhzMSu5VrX8JChoF/lVv1Zg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwB2MACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpHew//eoLOjdIOYyrQeoOUl8kDiER/fLezmlmlsPeA8SiwJKfTdhNP\r\ngx8037K9KamIjoGRuyku1ZiWL56/+F2zkgZXMpyH9Td36YHAtG2QcheH3KQD\r\n2h2pf4XlHd70kEYMvfwiQCdpK41AEeEIhkY4Ie7IsDJ80ryAb4DrelOycQJs\r\nBizZsBPtpx7f270d9uInfhxL6/6sK7OmICjffSonlKfFmnGRTzjSThGJd5Gm\r\npuKKVhUGEhFQthZE1hJsoZwx9Cl9QXEDra3mh9xfe8IYD4CmdyPzmKIyDMcn\r\nxuOSFSGhpgITM88YJ6in0Tfk5IGy9mCrsHkKPemH3WBI6xvF7/MdLnMxJy78\r\nrvPp+R5g8BaTsbFmXDPi1yUdYme6i7vDmum6DTOEska8fHoX+qHEQ/VRSive\r\nJ17dLJJKEwaa4f7Q/qUqcayfT6PCM0mwHX+EX2/DPgRcM0suHS6yeOWWo9+y\r\n8wBn8N9TVz644GR1Oo8ncEAlv039YIO7wOxmDD4ZgaImi6fzLbBsnon0P6bT\r\nCn4LJqfPOm/vOFNO41074yN4ooAKdl8N8dBbiQ7+K57DamovWvV3s5r6czhH\r\nngTnUNJWZEGt2mi+GyoOOD+jFAwmGMJ416qf388m0/C986fPo00f5f+KOsJt\r\nDPrB26RYIZ0Pa6n/zy98Y7X5YqlsVWduEpU=\r\n=VJpd\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-pg_0.15.1-80901ff_1673534860757_0.6411548569746182"},"_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.1-4a5b2e3":{"name":"drizzle-orm-pg","version":"0.15.1-4a5b2e3","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.1-4a5b2e3","_integrity":"sha512-BBNlGEpc/eAHwVL0ghFQ4ONuiNoi7p2JUlneOg7Bw078ULpuWjcgSPGlGinR9DMzIXBbIe2xCo9DTVoM8Q4GUA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-BBNlGEpc/eAHwVL0ghFQ4ONuiNoi7p2JUlneOg7Bw078ULpuWjcgSPGlGinR9DMzIXBbIe2xCo9DTVoM8Q4GUA==","shasum":"7bd202272a43ce3af0d41774e7624865d61cdaef","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.1-4a5b2e3.tgz","fileCount":150,"unpackedSize":228851,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDtIbZj5GljSqn93HDfKN2+UTsIReGpMIxTNiRJ10cj+AIgIijBzDZ1xLA5jxsL0HZnXSHSW3Vk2CqG6z0ovbyoNzU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwC5FACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrUYw/9HHP2EaaUJIjzKeWDih2dCuIsVUh42sH+Nm1NPJ+Zjlv052ds\r\nZpdDUNdhtifji3S59UNKzmxVyH0KnEaRRXHss1FAMtoPKDwaq5NJ8X/SlIG2\r\nq6I00v7mIoe5zonsXHY1n/S3A+BvJZhYzp04Ry3qi1go7/m7sQoBfmx4SFVz\r\n/IpxZK3jdp48RYPsYjiYYaTQgOFCQUGvAyKRL39JM79z/53oQhIw80fMUbpB\r\noiQISvz/9ol/mjabFMp02KWJ0u7v29ilf+MiDK6oOeYBh/Jp7qWXzrA3FBLt\r\nlF79BdECZHQpMGlSwQgaE7oCk3otC+sMz7YBLrs7xrFCHmB+kd0RtUEfBj+P\r\nczXTSt9dK/qfNN7n7TUpVEtoi18lfBvoGv/Lvax9MFLRQr+Z8ER7jbphduGt\r\nTt0JgqE038NlZCTIEeHOVy7Kkoqv49E79UBqlwvYMAXYwuG3StYoIYro1MjQ\r\n02+VheGF7bDIGntAaFQDNzQDJzUE/3H8AJ156IHJhLaRaYFcPr3sMJNgPQZs\r\n7mketgA56QW6EfHaWtBhUSIy+IuOWxmPHhhtyWmr3JczLLxfRiDEa55kc/cY\r\n6GIJF1dBtO6KP/JadBL7zrDUd3pn1fEkWHwNlqWUkzWWwD+wa+/rCzb7+PU8\r\nN2MocyXUo318HBRFHUPYLEHA5FlcDPKZnE0=\r\n=XpeM\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-pg_0.15.1-4a5b2e3_1673539141001_0.6292749075273165"},"_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.1-9728cc6":{"name":"drizzle-orm-pg","version":"0.15.1-9728cc6","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.1-9728cc6","_integrity":"sha512-cl+UQuhnP65amXlQToKVGUpIAF/AZqvRzQCokJIAWqW/yoNalu2AC4OnSz5/k5v7guIlQ/CJX4hTXNtw8aEpuQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-cl+UQuhnP65amXlQToKVGUpIAF/AZqvRzQCokJIAWqW/yoNalu2AC4OnSz5/k5v7guIlQ/CJX4hTXNtw8aEpuQ==","shasum":"f9ddfc6025c147a582e643279f19fe056cc31047","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.1-9728cc6.tgz","fileCount":150,"unpackedSize":229277,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDOmWYKB4AhcUB3ldCdMmTNkA9ewc8R9GMg9xzPmYceqgIhAI3gBRLiAwsOS1DOyIfQfei2ngB+A1e2mkiAuY7SAvqF"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwDbKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp4vA//eaa28PDZRVmcTweeZadGcGywkyeYfInrkSI44IRxFyuMQ9Ty\r\nK+rANCpKS4Oum8CB0lNUoSY/faKFmSXl0isRZ/nHtW3cJfj0Ddzke3SOYh2I\r\n+f0/EPcFV0suWkxFPv/TCszmDi8EqHNq7shrmebuZbxHbfy4ez5d1GU4wqC0\r\n3YinFLEXvDiL1CgNKle8MZFMan1uJZGxXTNHGECLNqedjLnnrQxI1lpXAAPt\r\n7XQCdtcPUUplqKZgXjpI/ST2oCYob2rwOQ/rAgCCjsWImGYQFQTZ5EIydS1Q\r\nDzUBZVK42PltURqaZPs9BmXpWY7ANkMARq5mvc50pJRg7BI/v0RwQbGEp76v\r\n7B7giAZ7En84ejkmSzVQtINFBy9Z2epXT/gmr0jVtEtVFaryUForrKQrYEZQ\r\nTzwVGXaAK5adt9A35VhZBljVmmP4f0+EUYEPwaTcy//cjxh6h5hEq3wzBdYq\r\naCEiGqxr4HeTvI7BdtYIWzf5/kaVGEg+5wV/xirAhifzQ5HkqemLC5iN9fbm\r\nmJPvNJcXBWHMDiKinGNNxCm5FxA++M63cRdLw4896yyk2sGAENdHJbg8m77V\r\nsEv8LRF7D7dH23ppnSl7EjdLSfqm3FyWpPI0lugRBs/UEgiibJwlFcw0J8tB\r\ncCEgcz/KC0st1CC6iWc1p5h5Z9Z26idVr88=\r\n=M8U0\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-pg_0.15.1-9728cc6_1673541322450_0.7568378994580489"},"_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.1-19c5c02":{"name":"drizzle-orm-pg","version":"0.15.1-19c5c02","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.1-19c5c02","_integrity":"sha512-ZJbANYWHHj38aVLUf496ngAPkPcm+fFPFhqfRS4Zz7q/3I1P2gxw2BHNY5Eegt4NmpZtJSHfS5pa2fs9oAFoPA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-ZJbANYWHHj38aVLUf496ngAPkPcm+fFPFhqfRS4Zz7q/3I1P2gxw2BHNY5Eegt4NmpZtJSHfS5pa2fs9oAFoPA==","shasum":"f15d17175d9eeb01367030910d66e9f2434f91f6","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.1-19c5c02.tgz","fileCount":150,"unpackedSize":229268,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFMVfO5/pPm+izOAn75COEqR4SdkV3Pn4flo0F2Z3qO0AiEAoJtxCGcBi3pPGdvi3WhXuQuoY6Hoi5NXdgY7agyBLdc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwDneACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpjqg/8CFqyDXBqvjIsJsq9yMW5EYIQ77Qf3sfwqdZnpIDW60lMiSJm\r\nrKcwl4Cymp9rD4uh1sT4wOv/dzPZP5DN+MoPL6LIo4s3lShUdU6D7qf7roie\r\nkcrNUxnyNw63+sUcuNzqrZxokg+SQZs9vnX8O7bD0Hmvyq/rEJs5SBYtf66m\r\nNdNzCNZDzKYwYZyXv31fZgs0Nq+o6zdiayf6wJPmpCz5CJ4EiG8aG6ctuVVJ\r\n0YkqTiJ1k/WUtt/lJKApEsdDFJsISAfoRAtCd+vRv+VO3kSyXDbfNS+QqYdL\r\nz9ABgCXu5ye1fVdv1aFMD+TWj2nqA133c/JeCRfy7qz5gW4u4nG59pazOFVg\r\nNm5T5vi1eV6BhycR4GIU4LVTgYzJyZCJ4E4tgZrs8JYRJcnH9H7F4q7yZtIq\r\nh0lDxUAxZFy7SpxP2xIu6Zk/22ni7XlAd6dpAm3ym+AncVlEv3/+J5h0oui0\r\nP4vFEv5HbCc0UvJQ5gQBsiXqjYYZafGVThtXAGOJf8TjIYlMUBpyeUmEY4a/\r\nZGh0skzVHDYQxkHyzWMlxTqeDvVf7FacJLfszolvZeRSY6wviBPN6qMX0WCX\r\ns90cE/SIBlFei8AJ8AjLyKdVTG4d1wksppFftaZ5PeSkOJ+Vq+GLBq+SamGN\r\nH+O97tsaFwR2X7MzphaAmyPmV1A6eQu2C2o=\r\n=r+84\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-pg_0.15.1-19c5c02_1673542110340_0.6842023699273587"},"_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.1-3548c99":{"name":"drizzle-orm-pg","version":"0.15.1-3548c99","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.1-3548c99","_integrity":"sha512-8jAgF4Kze23bd+Oh0fSs3V1WU2BgD8FeY8GlWQS1uVUWITC7IZw90btwtxZXy7bSxvbCi3/hsB2vZfCa3eQDqA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-8jAgF4Kze23bd+Oh0fSs3V1WU2BgD8FeY8GlWQS1uVUWITC7IZw90btwtxZXy7bSxvbCi3/hsB2vZfCa3eQDqA==","shasum":"5e36f6319036980b3aec002d8ecd427dd53207c1","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.1-3548c99.tgz","fileCount":150,"unpackedSize":229268,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCkVANde9ECVKJSygOZClHVvSj/FSOpu1ay3np5MEWuzAIhAO0lt5XlfBxmlDxxpIBOi2EtoeWjq2QxydiKLAhAMgrK"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwEAGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrfNw/+KgvNxNjhFtRuM3BuQ+qONxT2rvxNsfS2bT0oAVv57QsSteyf\r\nnkDFhHgZxDOn4aPTig0rgMafXEHwywdUC5qL5hJoJWmvAEkbunzf+GmbhDrC\r\ng3vXZqjxbAF1WS7emgQJHBxO/jTeM2G/tMfhzKfoMt/FpQoxyjyar9cPtFFJ\r\nKlBt/ra1uF8pgcRpcAh6bSaTxxqVeHH8WOlkA9h1Rid194q+MuZXLfSuLW+s\r\nVfpGXfmWsLJ+L12PiSdzwfnNt05NSKB079uE/ZLxTqeXwB5hPmg0qAe5s98d\r\nyGYKRLHwKBjyCPaJDnnvZCsb7ZjssZBKDAO7t16uFp0R8u8O+ggt2q9j+TIB\r\nLDlE9Us5IolU3LnelEuJDY6LEem/1UVunSAAAmT/SVkITYbGCYUzSv2KoIzL\r\n2e96ArCGHLoY+onLRb5E+YtCJYxVj16btr7XXeOiZu8ZNTYtcVI+2nMq6W33\r\nacCnXrolXUYj9lfbptyoYCIqDyG4zKmp7kyWhiFwFtvw0XdYZdTYOo0AfjvO\r\nwHd/4WmG9Bn4l48HEqJwc8mzUQrGmFZLrIIfZN2PQ/tYPuBirAlHtj731W57\r\nTeGk2a6U/I6bleHSGaP3awcBUtQR8EtU3V/iymS+P6wEAEbfxxpGPupWGrhG\r\nPA1viFaxVXhYSKcJ74mqrLDp1OvP8jlR1C0=\r\n=Wn54\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-pg_0.15.1-3548c99_1673543686471_0.33480370115607005"},"_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.1-a1b76f5":{"name":"drizzle-orm-pg","version":"0.15.1-a1b76f5","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.1-a1b76f5","_integrity":"sha512-0cgWiktoJ9uQ98tMEzYkxEzFtnpVzVlrPSPTT3nCcZCWuDm4zD73c496gxOGBjvc62kEv3ECiNOMvF8tWWR+3Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-0cgWiktoJ9uQ98tMEzYkxEzFtnpVzVlrPSPTT3nCcZCWuDm4zD73c496gxOGBjvc62kEv3ECiNOMvF8tWWR+3Q==","shasum":"1b4970924d7769bd80e8b840b20cd46b9bd96c76","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.1-a1b76f5.tgz","fileCount":150,"unpackedSize":229693,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH04LtBEu3Hal31ZmiEFD1ZX9rH25m+4xGdeBED1TDXaAiEAjROwjgMh/nKW4ZB/MN2ULKVeA8kPr+gsNLV573iTib0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwTPPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoZiw//aIWfalOo5W/DQGjb2RrtG8DCG0nIVHnARdOTj70Cv65elhzW\r\nVK3EIBTzyJKd62Qnpr5L7MtP686JHWo65ZOtUluF6feuWUHzBSsfXcbeigFR\r\n0vaTfHv/uB7iWz0wTcGaLuHHeUMax+s1LK/497ue1ey+WtiPxFyFAobJxGCQ\r\nyYlk4GKzo0GN5PZZRySHUkSV+m8Mcm47aCfjeWdEfCAHIMwyQGq8dfgrHDOR\r\n1AYnbG0y53wsMLlr9bOvkClxowlVOjAJuysAa/fuH/UmwejtHslW5wbWB1WE\r\naJTSUocfUc9hLudnDES2c0dXyK4wADjU//yhVi237slOMqUGdj5f3lDY0bqC\r\nKFz7zYR88q87p3/7F2g3NSB0zcKrGBWqNQq3zI3FEhpGWzitEnsFooq2qIQx\r\nrgfJh+Z8XTxXJPDPGcEziuZT1L30TQXJikU7MNs2bCU8Y9YNAAxTebm8K/1Q\r\nkYWiwsBgDNUuk9rzyO8PanMzaBqL5rJY6/V3LHWmK325hq2wQWtZK0VQVP38\r\nEwzkYgUDK7xT735U3CspsbI8PNztszM2sM18Ym2WpED/FHJsjxURIx6FTW2y\r\nvlcAZz6N3WvUMGa5r04rbrqBEwcMeO1E8AHbB+IRfY5J87xZ+MUJ35bHn9l7\r\n1jXl8cLKSo8OF8MhebK5jGGOLHbQd4YetuE=\r\n=Pf43\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-pg_0.15.1-a1b76f5_1673606095720_0.17586624680920848"},"_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.1":{"name":"drizzle-orm-pg","version":"0.15.1","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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-pg@0.15.1","_integrity":"sha512-KVtxfdV/bMLcSzxDD9ZA/09ZgOoP61OgLXLkn5b1eo/QQ/6P0cuja8Y4kfcmci5MZLXNhtxdbgQ8GLy0vEa7FQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-KVtxfdV/bMLcSzxDD9ZA/09ZgOoP61OgLXLkn5b1eo/QQ/6P0cuja8Y4kfcmci5MZLXNhtxdbgQ8GLy0vEa7FQ==","shasum":"8e28f944b92fbb0627867daddb4967516542755d","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.1.tgz","fileCount":150,"unpackedSize":229685,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFDD8KWN+yg3XV//LBghdIT77AEKPo/u7HnnFtvxJlXoAiEA8h+df/vDVydkGsE+dRNh/F4bQJvNCvJe4PkcrqITBts="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwUnCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrnEA//W7NRHWKC0bE9QR/MDAVqCwEHB2g5/XT+G4/rxLsOe9ct66xi\r\n/m17+dEZIKB3bj9Tz/kpe0WTU99pllur+aaxkGBuVgt7tHEJ2FKf43M5Xqj5\r\nn0fW5GElkqVmM/lrh+iQAq+AMSldBRO/38LTM/OLkJAcNVnMjhLEhn43XWFO\r\nMhf1t+MTfad27xjUCbBcmtLMIWdLKEx3GYaYnoplHAykGSSTPMjXpvbmopzc\r\nMplIC5OyR73ihMYKbY8VP8gNcmd1KBCSqKPglGd7apswlSm1Bh9aUboR0TeY\r\nOooNgEqOL+u+7lkyiWQI95GfP6z76jTSwjg68VLfObLLpRBWP8RnpzY5lxMN\r\nGyiWi7KeA00r8I1PQxN5B00WLTt5DuLDzcj9/QuLQAirDSddAPgVDKQhTYOS\r\nDicw8DCqguHGDTaW7xfntI+GpPfSqtwJ1Ky/reQZr9+C+tNenjIIktHsRiL1\r\nDeIr7/hkTUksxNQBUWwxWqI22HXoNOtf4IOHzppQ6C0SFsS4AzN6ppEmt1rQ\r\nOeKowc2muSAHVwBqhK1j4AmwAj9G0mx58fx9r3QbqCoApk4A6BKM+qKwwHu/\r\nAY6fll9ky5dhZvKGvZrzI1IZORRV1ZRTgJ6KAyA/b57xqmKNeq12GGZbj+c1\r\nI5EFEd+WeGSPfvDz5YXgQKoho1IvD2noEQ8=\r\n=K9uu\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-pg_0.15.1_1673611714073_0.2557834074630123"},"_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.1-656bcc3":{"name":"drizzle-orm-pg","version":"0.15.1-656bcc3","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.1-656bcc3","_integrity":"sha512-eXbKcZlZY7TwIh2kWqy5fG7FoyDdWrfjPA9IZEEQ7qe9nHjLQt1UOpzn/YAkGqtTAC/NFwKFwTpbND4LRZCCqQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-eXbKcZlZY7TwIh2kWqy5fG7FoyDdWrfjPA9IZEEQ7qe9nHjLQt1UOpzn/YAkGqtTAC/NFwKFwTpbND4LRZCCqQ==","shasum":"4f38d4080bb86928e17fb6089b170a6536df8823","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.1-656bcc3.tgz","fileCount":150,"unpackedSize":229788,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCCoXS0qEpi723JxJdjJaylj4mORy52XEipOAx5GvUmXgIhAN1zIEmvpdMyfa01deEW2eaFmpHMIAblAQhOVp7X1UWt"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwWmAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqDfQ//Ud/UsK4831TmbfnwDmrEHlNbB5xqsShIRQc8T7Fmh4z80any\r\n1hDNz/EegaEd8AooS9gUZclwps9eaF6Y3Hn4+7HRb3MvCLwCYdGehtFNof0i\r\nMqmSMd+6qktGcKn+Y0m/Yt6aeFfTxKeErdWMDYMHixWiRLHWXWdbRBTqxObC\r\nNCYdT4m133h1GBfId+fFwXfxuuF3G/ci7zy/3v13tz0EvpbT0YCk0KNCdsdJ\r\nw4K72t59ClU5HRdIzqXfBAEmP0G+HLwsC/rY+xdU4nEe0O4V4AJIjyd6GCtW\r\nphRVdKPq3/p3Vv7xHYeoLmecJGnDIteKW4xDS+P7PlzlAlb5+G0OgC+yXfDn\r\nozA5x9n9hVZeAE41NJtk07Tg72zMfkL+cQu95UKhNIZog4LKTXYjSuQ1Vu5o\r\n4C2Pkbv61Yo6xiQP4kfOHPWJDyYV4nuGMdvFJaND1fG0YEzFsO5qstqLAWO8\r\nC87b19pc2iPlCdoWXSVroOEDqhDiAjpf9+xpMpEej4mVFquHYe9HFOHaOBtc\r\n2C0AQ7OFTA4hDSxSVyN/2nyJRHhpJoW1VKKx5RWTFcp9vR54OKr514ZLYwwg\r\nlAVRkXuT1Pro0JzmU0r8fap3aXz1yCbC2FCF2EniQvmqDs6kpEwHwlL3ARqn\r\nL652nkcJT3I0kij4uiJFVBevyIW54zekDqc=\r\n=22rt\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-pg_0.15.1-656bcc3_1673619839875_0.5128093468674868"},"_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-6879c1d":{"name":"drizzle-orm-pg","version":"0.15.2-6879c1d","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"dependencies":{"@aws-sdk/client-rds-data":"^3.245.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.2-6879c1d","_integrity":"sha512-tZwTSMuihI84ER4rGocscKwwfrTPYMXgdsvt2IBbs5G1TDVz3EH4xXM8Lfa9szg1jAyKXr7b/BE9RwBtB7IQGA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-tZwTSMuihI84ER4rGocscKwwfrTPYMXgdsvt2IBbs5G1TDVz3EH4xXM8Lfa9szg1jAyKXr7b/BE9RwBtB7IQGA==","shasum":"338610bc4e2d669beac9f53d0264f81c5db3e6f1","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.2-6879c1d.tgz","fileCount":162,"unpackedSize":252498,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnSz3zLa26l0IluIB4wjokIld3nLEEM7BzYvZmHAUuQAIgIfmkes2B8QZDznjvLNW4YxZs9gRSuEaAScnbrotDICk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwonQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmryuw//Xx8gATfqn8PqS81aTqNVyusVhEmNe1QE7Ei3JQO7os/ItKct\r\n7XHV7HeoF6huivth++L5arQLcgX6MsBY7lZPrghdl8i7F8NZ2J4/Svh8ihwU\r\nfYnL1ewwzxu5D2bVw00H6SfoIb3cxlqaixTA60iS2GH1YV6jw6RPD9vHutsp\r\ncmGLR9Gq1bY86JriynV1ndEapM7NcItuKBdDlpyZ6EWQLEIgpOUbkJ9IT4ZA\r\nnXgVSpz+Fw8wmaPt8NzpSUUupANBZq1SMWaWZ8CLesv57Z73jsN0KMuziKmm\r\n1h2G9nItxD3XmCLuZBwSFNoViMnlU1emDAuizjKwzfglvjmZRkKD4C+2lVCJ\r\n8YmJ4K0BvKIJkgTtjyL9OZGk+vnDnGDguBzX9QeMqu1YB+LP3MKZfmu6p44I\r\nAsFwVvKJtIiq7opvQOVsE3M2+NaPb2gCrOiZevUHmsvfWtOI57XRxJqNig80\r\n4G9JJWHbThp6reDw9HXdqnEa9pJOD2Cl438OU6pBQGwozNouxg2bB0LoWY19\r\npt25zkL1/Ag36sT2vIMlXo2nMW6QjTIurXK8i6uziOVOApFK868gFNh+F7+8\r\nuhWei/LwG/YUB0csBwZxoIiwYChcsjhDuqDzRdfOFveb7FNrG3JNxQqOEw4H\r\n/+urj3IN0TxifQE90YEwWx+qc+zia97B8Cg=\r\n=0uqu\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-pg_0.15.2-6879c1d_1673693647724_0.285466595467047"},"_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-1766537":{"name":"drizzle-orm-pg","version":"0.15.2-1766537","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"dependencies":{"@aws-sdk/client-rds-data":"^3.245.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.2-1766537","_integrity":"sha512-gIWrUOW7plBkAh3D9WmPJisA5cFhlfdBuJc8CjUhdEPAE33RPZV1352Bw1PQEf+RkOe6bW7n3GeCQlCO9pR4uA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-gIWrUOW7plBkAh3D9WmPJisA5cFhlfdBuJc8CjUhdEPAE33RPZV1352Bw1PQEf+RkOe6bW7n3GeCQlCO9pR4uA==","shasum":"9e0da17086bbb35565c9e29d4f02d799fabc46af","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.2-1766537.tgz","fileCount":162,"unpackedSize":252498,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAYRQhPXGiFoD5ZlOX9SDp4mIcB/WS/bNc3vPsZlbcy1AiEAsCB4E4Zm64tgIyqRpxiN2+Z/dbBtjpR0eU+v3PmfXzM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwpIWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmojBA/9EfMTLt2DiAVDc7xzSP3CNiiWyLL7DQTl0OixWs6MbC2RjkyX\r\nnW1Gw8y6H2TobUInH50JQw4XtRMtP412DSaAv325QgxAqHxEZU1gPgNKstWc\r\nuH8hXhcycqx+wA5NjGPRcnJw5DvxaUSPSCFQkWZgCk/eId/QgfVOjBd9gxuC\r\nbq8mqrah2rl8798YO1wEVhSx0q56Br2jNDOd+yJO8XFB/LCHGiGNpe8xA979\r\n6l0pXWfkVcRDVlb7CI5TL+uvY/zE5XohaMdBvGFW+Z6xWq0SBEzwUtjyc13C\r\n1KDjmRfYpEFJ7BHcmSSEaebSKT+DTKsCkaGMl6/mYEOMLKs1idzMvdkNTV+b\r\nu4wTExTh7D9bBm+JailKYRiedYg/KWT3OzncnJH2WpKxOrhYyS1curD5iwrF\r\nkZaEvK60AKtIy/L5R/oXH6sMCAPlxkUFymR87i3TKnLWAUr8Eyhh/sEYLIi2\r\nvMhSfCZgex1xqMVwkPac6pQX5/cqe20Oa/iMYMCa4niemMsqFY0nl87vAfwL\r\n5fFjS3TsKW77zITK11AVlNESHxnqhYy2hrgaWcKB+Er9R27bz7NzkEm59sUs\r\nVtDvRKsGpK+HGvTJibDJyJq9EPElzyk3yGah247UI5mFrIkbbd+3zXrnnsq7\r\nLjB/povIngAwQwwAC+U5nlKpMH9h5LTTCr8=\r\n=ofPx\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-pg_0.15.2-1766537_1673695766055_0.484770099065273"},"_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-2b4d90d":{"name":"drizzle-orm-pg","version":"0.15.2-2b4d90d","description":"Drizzle ORM package for PostgreSQL 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","@aws-sdk/client-rds-data":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"@aws-sdk/client-rds-data":{"optional":true}},"devDependencies":{"@aws-sdk/client-rds-data":"^3.245.0","@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/src","pg":"^8.8.0"},"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":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tfullName: text('full_name'),\r\n\tphone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n\thost: '127.0.0.1',\r\n\tport: 5432,\r\n\tuser: 'postgres',\r\n\tpassword: 'password',\r\n\tdatabase: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', [\r\n\t'unknown',\r\n\t'known',\r\n\t'popular',\r\n]);\r\n\r\nexport const countries = pgTable('countries', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n}, (countries) => ({\r\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\r\n}));\r\n\r\nexport const cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: varchar('name', 256),\r\n\tcountryId: integer('country_id').references(() => countries.id),\r\n\tpopularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => ({\r\n    nameIdx: index('name_idx').on(table.name), // one column\r\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => ({\r\n  // explicit foreign key with 1 column\r\n  countryFk: foreignKey({\r\n    columns: [cities.countryId],\r\n    foreignColumns: [countries.id],\r\n  }),\r\n  // explicit foreign key with multiple columns\r\n  countryIdNameFk: foreignKey({\r\n    columns: [cities.countryId, cities.countryName],\r\n    foreignColumns: [countries.id, countries.name],\r\n  }),\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.2-2b4d90d","_integrity":"sha512-fojTQhbrQDqTXPMcapck28Xxm5pIwPD4M7DU0ALet4qcVTK2torFV2+ImZ3nEefoGFCp8qNA5AiEBftXbF8vzw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-fojTQhbrQDqTXPMcapck28Xxm5pIwPD4M7DU0ALet4qcVTK2torFV2+ImZ3nEefoGFCp8qNA5AiEBftXbF8vzw==","shasum":"08dd561b45b2ddc5c767d620a6636fdafd773b95","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.2-2b4d90d.tgz","fileCount":162,"unpackedSize":252577,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDddBVD0yIR4IMteOrByNsh7vsl/2zsw5lCwUK5dx0mLgIhANk1SNoVlutcHXN9/E2jTeLsAYazOGYTeMVmu3m95HRM"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwpbAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmovag//ZJDw3Kxu5u/F8htdqNilwzqcr0N0q9WE0/MdqIbvPTNSZVR5\r\nkPhC6VoUSxJ5jMbaTH2sqP1Z7MQcicjfroaaqMm3NZuTt7dNEsOfPEj+vEb6\r\nwhEty1S/w5z/Xwl+Dz/Sgk48oho5sM49c578ry7X1buGBYQ7PQOCwnLe4vV7\r\nS0X22Iav5yMOZpAT1Yv/D3bcNs2YOg6q40L+ZcMyyHBmREawc8avf7WpgWBJ\r\nscfdK3KGz6umpZ5pRh0jsQ3bX9+zD42NxMj22j9s24S/I/QjuQh1XSyxceKZ\r\nFrmvC7eCs/BZ5u5PosQpktzwtOqbUw6mifVA01jJNjoLpJeVzmlTOBoCNasW\r\nM78Qh+6eRraYc9yVs3dXa8FEBd+eqwTXLvZyKB5n9YV5A36p8cB+As46BoFz\r\nArw1pv/xQG3jtQX2VRARxVuKLK5pZxVVlx0d3KFStu/phRT4VtzbqkUzmX70\r\nV4ipf6qWpDZYi4vqYU9Ii4CY5uoOOdQOCXFuc0VZqq3nMo0OmgALVJoX4OPW\r\n1hReV1cYHir+j19tDv8s0YVuHQaXyPIJe+j5JwuW/Odf13ZukB2UCpjHkgUy\r\nOoxAIW7RBKNKePnlWC43fiICnTbUh1Lyb/AMmCLvNqBEHjgX7uHbl7AHopKs\r\na1ra+HJbo2UfM40+QHqvWFyWBZ+wZqOMA6w=\r\n=Lu+k\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-pg_0.15.2-2b4d90d_1673696960304_0.3344903619633828"},"_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-pg","version":"0.15.2","description":"Drizzle ORM package for PostgreSQL database","repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"scripts":{"build":"tsc --build && 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"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.2","_integrity":"sha512-RJxMhjjFmaNj3pkRit60M0V2M40jNZUNTYCDwE+2OoemjZ7Ml7DPNIZOD+oc3AUTpIVi+30iz3+LM1ZfNk2nCA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-RJxMhjjFmaNj3pkRit60M0V2M40jNZUNTYCDwE+2OoemjZ7Ml7DPNIZOD+oc3AUTpIVi+30iz3+LM1ZfNk2nCA==","shasum":"e6a44b14ad188f1971e1988408d2a6d433b40df5","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.2.tgz","fileCount":199,"unpackedSize":300956,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDvbeF2JRaXAMIAb3D5/cOku6GrZCeYGDvvQoAmg0kYxAiEAgGV8FlSZAHIOjp42VkFW/14VohgiS6VJP5PrzDRtF9s="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxVoxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrKxRAAjETnIuIc+5CVd6GU+S0M8lxvV3zoTobg90Q6dzHi5BUE4rWr\r\nStoZHnrFKn8y6N1C550xH9uuA8jLZdi+l3tkZwNZ2BUBdllE9Zi5ecZ00r4w\r\n5/L57BGLKnVCNXtjIxRPMgzMvhg/+mjfsBWOgMV1eIBemqM0lVVklbFxT1eY\r\nJKV+hNjj+FeM/55Zq90lSEba5c+gFdEKPp+lsP6/zOBQ82IhbHOWZ0XnfuXw\r\nNd4VJOce5UQxM3XqvIeXhZQYYvN/V6Z5+r/+vAi+ptj+D2JkrGSDOf47h0E6\r\nOa5ZeoSZySPfnq74mZIje9fHhjlnGA1iHjidjBg/W2BxJ4D+Hy6q+hwbBJN8\r\ncQ6zjmer0URjy0J2WfPsBtpW+R8WqVVaR6fQhPfboZn1uCrIx1Sq0zrlKISO\r\n1iDe6bji0GGY+65XWm2CfZSuGbaY4MWXXvGdK4IonumbHrjXqzK6jD60TaNs\r\nYiKFUb2oCP0AOh/aABzfc+56vrCPMyPB/9LM5CallByZdSBNnvmrmLVw7TGq\r\nEbdbBTsCH7TcdcGrHK79Qzucv8mB3Q1sz4Wfcc3cmoHcxyTs8bThmNELlqTN\r\nGhwSMfhguGv1kQulCZB6246FA6Nx2jXSupVmtf8cL9zEfCSLEcTZdnjTciFL\r\nP13TkG/NJU69fjFrXBSpTXAJqWbFcuRHL5A=\r\n=oDsx\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-pg_0.15.2_1673878064982_0.09274583078960963"},"_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-pg","version":"0.15.2-52e75f5","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.2-52e75f5","_integrity":"sha512-ZLRUdtmFwwiRU9dL8MUBAeq5wRKuvLmvXX4ZCqG32Y1ptYAZJJ5ba1ucIfmHM0jXcat95IA3NtN8KDyLtwfWVg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-ZLRUdtmFwwiRU9dL8MUBAeq5wRKuvLmvXX4ZCqG32Y1ptYAZJJ5ba1ucIfmHM0jXcat95IA3NtN8KDyLtwfWVg==","shasum":"296d091f2b8fa34e758c1afa0027cd81f877d19b","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.2-52e75f5.tgz","fileCount":198,"unpackedSize":289602,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDvAUtAZSnfTqTgKd4/t8jJhmEpfOMa7zGP6ey4JVdnpAiBDYG/+r9Tf9XvVsy/4baGjQpbnOn7xHak35yUYg+kTBg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxWHpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqy/hAAnV7m4GLikgjpxJv1l8G9QOPMjeujBjYZPtyhansfiZ01wg6t\r\nKlXX1MS1sym6ajkfn1OeGgKtbcRnyMoOXmTVcwvlXAA32jKcxKNtIwWA8JDE\r\ncfkCyjJ1ydZOs6y+OLP2z1yHr6THAN3n0JUKi7hb3ByLEjlukLZYsfPOP4YT\r\nlxT8ABPCWxOBf2pQ37YAWeprbC18ZPWKdRi3CzmbRuKT5tzJx0GiDXAh6l6V\r\n6qy6bmDbCpqiAZtP3fQ3mxEWMvcbm2NnfFKa//D8jSwqSHavqm+H0ezuy9e7\r\n7nlXKmkmmJgXu3vucqRzLR3MW4qUGqkrrbVxnSyvycJvxmdudn9e78Zc6f5O\r\n0USpdBcvFush/kVpyWlCp3J1/r9CPKuGGN0Ut/rcIlLCgZ3BFrPy8YS9QOJW\r\nLWGVfvOjTuJj7fZdUDoHMgKBo7pbH/eSHefQy4RL0WgPUfck1wrenHjkq5Dw\r\nMciNBjtauNAgJGorajCjScnSuefj4fXQN0dxMlBSFSRrJkXM2xy5DgAv5AsJ\r\nG6iSrGgJAP/L1d8Gj0pelRoQR5j6L1BpJVJRz4ZIL6bD6Z9F5crXzZ3Lgnsi\r\n63qJlsN2dWc5TFvCcxilAeeiZ+y5Z5OrzVFSuQjvK2oz21VLppVuLdmraQKF\r\nNCd1SuGmOv6cwaD5vvq4GIhSqbhnAo3hTY8=\r\n=MUZX\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-pg_0.15.2-52e75f5_1673880040942_0.04492307849998234"},"_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-pg","version":"0.15.3-c675dde","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-c675dde","_integrity":"sha512-K6LCDDZCRVvabQycQtoeKdgLpDQABS89mr+zF7ghdaef5X79iKItDs4k+28dJiGew1lEI+MLfaTAvSztt04Msg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-K6LCDDZCRVvabQycQtoeKdgLpDQABS89mr+zF7ghdaef5X79iKItDs4k+28dJiGew1lEI+MLfaTAvSztt04Msg==","shasum":"ff718e73f6d1d20b1e5d84c5e2dea392963155fe","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-c675dde.tgz","fileCount":198,"unpackedSize":289602,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGJIeGMxr+SFd8RTbt41tq2fAx0KFIiOUzYpFu2O5qctAiEAlryUajJdeUE/mV44U/929lOIcz6BtT9OuOo7PKYhSqY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxWWhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqQ9hAAiCK8uZzPpHA46/vlouX7Ss7Je9lB4EZYWiYKZsoRxTc/q8D4\r\n8Ql/o0zhQHoeJ3UxAXld5ez/9X/l4iwPAPbMkldhFrMSG5PgZjn3iX9WDKaS\r\nV7L6EvSiYzcCNHmVFHoK5w8RknLhaNexy0bwB3PHWViVHLcvrc9x6XxASIHx\r\nhpuihkkrHf49r817l6ctLQzl1xGvcH9NDosUT/kYqxen1/8RA6VT7JM5rDdR\r\nM5HXHsVkzTUeTb5zsNkbM6cw5TeU8JxEIrIpaPYdGJ79TO8VdX+d3nhQs9lY\r\nzCo3VvGbwK/xPhwNKqg9tHcaz0tBYSHk2clyt6VaViPRHE+j6Pjfukl/220C\r\nBb8bnbb9Qh315ExNM/pS4IkeVoPDVyCLikdzmVS9dDteM4A7ynP83o49rXpo\r\nDIWOxivftIckhfT1eUDQxSirvrEdjp9W0QWAiRSSTKIUQGNZpOdpIDMkhBTr\r\nQn+ArtaH6YKL3eGixlsYl5sbLrrGQZQIwZhmAwiftN2iMUUylHV9y6R36ibH\r\nBo8C37tnyTbEgJbv6xJw4z68pLgptF8iD7gP5/maE2KHRjPD6bBXv8S1qJiP\r\nbDg8YAaSUcdHIK2YXNCsY8FlL8ks5pTjN1cuQB9GMef5n03QDULnDHosLTue\r\nZ0sAXgeZh1nzCGQ14efsZ1vJMMToMblUGWc=\r\n=Xzc4\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-pg_0.15.3-c675dde_1673880993017_0.3965488334502618"},"_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-pg","version":"0.15.3","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","_id":"drizzle-orm-pg@0.15.3","_integrity":"sha512-A1FCb3w2M/7FCxsoZ2+4plY6HFp36T/9Fy04z3MIzv248kG5oZX1HrYcuZighv+B0XqJR9Jh7egMJtFIs9HJAQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-A1FCb3w2M/7FCxsoZ2+4plY6HFp36T/9Fy04z3MIzv248kG5oZX1HrYcuZighv+B0XqJR9Jh7egMJtFIs9HJAQ==","shasum":"002586abb8bef4bdfc269cd11b6e60092723b252","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3.tgz","fileCount":198,"unpackedSize":289594,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE+63XKeVarcwV6PX1VKsR0/+2GhX3tPjBjAhOZQ/PHEAiEAy8ZnbaPvVRUsNDnBfcUySq23CcRdx4C5Iz+oteJr9Sg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxWbXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpXeA/9E3eg4oIRE32twDxaQhveJAcbB5DnrZCP165D3bkRbKiyLH2Z\r\n3+WTzDvYtTZCX1MEFd28z3sZvGycd5RxOLX5MEiRKBstcPrNJxPDR4oJj4hs\r\nWYWwjLiFw9RdJulQKXM3BYFXXjUWwYBx5IY/w2jJUjSLEDpjr+6hLmQ1rV5j\r\nt+YSCin9oXZpPH64TOqWfTEhM63ix0YMRhA923UprIkQ8rUhZYbCkZNir+Ss\r\n3rS4RVe59Ow3gg3k6Q4JUSFtwHTOEM4iwDdLw4o5gk+IT9f43PxrTiB090Vj\r\nsvU/oaHDNXB2ZOWZ7U8UXTHCiZUEC+jFGWcI3jWXfkOytR9Q3G69fX2nfbA+\r\nq02yhMEFS816FyZmAPUnX9kjzWanm8F9eakCjxiMGGxx9M7G4hNrTw1MMVPo\r\nOo4uUOWGhy6cwLQWDpGAiDdkwijtCsbFcwKQTPKXKJ3vqbTRYrl2r7O1wVoP\r\nmIoZwGLsqcA4hOuaqpa5BbOwd60xyYiKTRg3WBPCk2ZILdx3p0AdMQStaJ22\r\nHy1iiQ5TAmBPLMLLtwRiQ0g0+RQb8ES5EhrcJZOyEBY7Bw9X4zG5vlaoG/24\r\nEmfQkAkbOwmqtesZ8SkpQsY4WHLVH9PqwbVFvDCWflZmBTpXElq6yLNe9uaM\r\nNuPQ1TNNLnlG+y6SBD+/VbczmjbehP8ncgY=\r\n=vRD1\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-pg_0.15.3_1673881303796_0.7502595524417268"},"_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-pg","version":"0.15.3-1e62a3e","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-1e62a3e","_integrity":"sha512-Ly9Tlobo+8o6NDh2JGt9INoumsuNvQanNErkbDT6d7PB2TcxtEonjdVHDMW27Vil7LFaro5Eu9Sj5uqw0nEmjQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Ly9Tlobo+8o6NDh2JGt9INoumsuNvQanNErkbDT6d7PB2TcxtEonjdVHDMW27Vil7LFaro5Eu9Sj5uqw0nEmjQ==","shasum":"d25f93b6c492c30acf2c41a51711b2b26a89d53e","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-1e62a3e.tgz","fileCount":198,"unpackedSize":289602,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCj9QqXgLq77pU8TfvOTP/26UTxS1qimJrjxqwGI7atBwIgB6MeLKF7YVgDn7uKuOxFmJrCqlTDPkoE8GNOhMwZcG4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxXZ5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrEcg//VqY5QTAl2hiIo0iyTsmSgJFzx6ClIjwBSoboBF1Ab9G8qvGh\r\n/VqHHw8JxETOwIG02iMTH/bFUaE4B3LmEI83vo9UNN2I30nxyrL+LqLtouHA\r\nbREQCweibG43DY556pU1Lgi9vJ0i9Ml7tTMJDQ4kgXZYu16p682sxy5J4DFm\r\nrUF4hQZV5q7CRtBJt07rMdgz7kucGzScpuHIpCLnFrRo1vhfWQ8/e+ok1fyV\r\nMHfYGMBAKloqyvw6HlqPcXmIimx0lXIOpBDYB27Rt1ysFszVfJFaoMVhapZL\r\nTwm7YP0A/7WQ+3PBhhAuZOTe/nyoS9UniLoj6JK4Btk30h6KPir259MIrVo5\r\nrnihIaev5ArPBdta9NkXwSWNxdoOrwoJJNGl09NoQ3OOlNu32mqz04wkNaIQ\r\np0JfJCuMGklyD6x0Ka3F7bTQXjyGCJlZ90baS6vDfW+HLMg/jjICh3nEIKxZ\r\n0c03+CfM4F6GlZRr2vLHjMtAa053BtRKzUybiiEVTSpx4IQYXflfZfP6nsIM\r\nB19oy/L9t9rcPhMJMwh9X4Iwz0VBz4lLddolECvQpMVgPWw2xbXSCjpAljEQ\r\np6TldkwmmHQQxyjJHmCkSbphXzwyoCPbi2GMeCSN3SNLo95Bye7IIu9IXGv4\r\nD5QSjkBDLuaEanCW9fTOENFPzXW/SFzyrJE=\r\n=qPaE\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-pg_0.15.3-1e62a3e_1673885305057_0.4427082256146755"},"_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-pg","version":"0.15.3-72fb2c0","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-72fb2c0","_integrity":"sha512-MBX9OBDHV7omKsI+xGtmlk6T1Mm/NUTNg8Edjmf7CDborXY+KnlCCG+DJI1TDMojI+CIWlLRkcRZRqesmfaSdQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-MBX9OBDHV7omKsI+xGtmlk6T1Mm/NUTNg8Edjmf7CDborXY+KnlCCG+DJI1TDMojI+CIWlLRkcRZRqesmfaSdQ==","shasum":"cc571b3b8132667049c0318a9833d4715864cd34","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-72fb2c0.tgz","fileCount":198,"unpackedSize":289602,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDqP9bIzEcLgamOzz5pjKZiCrdjYZUfD3J6APj7ik1BlAiBsG8pafB4LyalTqPXbLlSi28Hns/gSYWjL8bCaVpsVgw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxX6eACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqFIQ//UERpK4VQSPmKcfua1hFQQrPHtksypd+4nsXug8mfKel/IHBe\r\ncQsiSVzB6LN5E1BFRf4qJ0YAfaeIx73wpzya8lD6HOzBhkJDlADka2dah5J5\r\n+JZf6S//4Tm360G4WXjFf+wMI13V2Z/9yggzEl+TKbrbY/QDVTYMfZmaePy0\r\nrkMKisPQCkSXuLilZptdmiLpV1ZrtsDm5e09iur57/7fG7FAh/dTKYTVY/+4\r\nCIOv6c5FqA6DNUXVjvGIBezyQ0gS+p4Q/tncZjoJvXjZRXKXPfQXBFYMGxkR\r\nUhTtMFjti1M1CwJsqpQzZj2tQwnuheAQD+BAww9jTYCjWy2SmFFnx7CuJdVC\r\nVzdX5086fJQLGso7+HPlrDbuHiUGcuLAnZLVLJylGEIPws0BWaAPt0rNM9u4\r\nV9u7uAtdMmBRDm1fH4QKXOYB3SD0o0OClVnewq92qjLmX8kuKyemTUEkcb1K\r\ns7xP+rQfzmzXi72m7DvVy1PTnsM3VAOuNvEe0wWueMgPGP3TRUQdUKWMtwTF\r\nG1BcCgkdx43FNEXc3JeP25sh1HwAIHa9aefmwbuzTc9PSS9Luj6regV0imUY\r\n+4ZQNJQOpS5wF0rR0SSCg/IIwEmQMDQroEnkl367TDrB6ethNIiQlM6hbqYr\r\nq3osC4/59XKtpbP+mVWAZ8FuYOysC18r5BQ=\r\n=9dw0\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-pg_0.15.3-72fb2c0_1673887390510_0.006745665585876637"},"_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-pg","version":"0.15.3-23baedd","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-23baedd","_integrity":"sha512-mEIjCmaulVvFNGsiFo/0kcrTie9aIk4AEhlBkVYGSijxnlHLojisx4wxLFKnGSC7+8EqyoxTldaHjMV5REAkCQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-mEIjCmaulVvFNGsiFo/0kcrTie9aIk4AEhlBkVYGSijxnlHLojisx4wxLFKnGSC7+8EqyoxTldaHjMV5REAkCQ==","shasum":"0dfcbe24d95fb8e3b0d856f20dcc686bdb97016d","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-23baedd.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDSJMr0pavbS3WqTkD2k1/CjWqoCotzFgqt/F1FaODj7AIgGRwdhhMhIwfOG+I9UOgnzjt0JCeToY5FN00dX7+WVf0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxZHkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrKyQ//ZPpHvESZRBsEHf3l93TIrJv/5OiF1bHcNIAnLu/8OYOJuRCg\r\nlqC5n/mLU619vMLTzJB713DmeTVuE9Nlb0uwklZREsV9mnXrUYCKFV7qOUlE\r\n7cravx/f3hJqOn/N51a+KUTP1llUvZzBUnSTHMgGXLfj3p/pSDaHyqKQZ1ll\r\nF3Y+pU/WlGCz+rTPuOCmBBRcWIXT2y38ry6lk3787sCLjyvUbFxM36VKeS7D\r\n8lyIGeTrA2wSppmR5Y5nHdWGrX/QBXeVMK64XdXw0gsLerlbzy3D+fqK4GcZ\r\nSN2Qev+vvJVKkjra55o/jEXKPW3EJxE98pgLQlEE5Mm4mKl31KyN9QoJTfss\r\nSHtI8Xe/200IyqVIgN2v02hMNEeEBTQRHwnClFs04dNTOoeEFGyP1/M+acD8\r\niGN7keNc4EFBptZXsJC/bt97Y5nwg0w7Y8/OqkybQj/XyfCjJTxsI3qC7hVR\r\n39reyP/sxwHpbbjkks2pglAHn6SJcUnGJIufjfuvDUlnFVsYwSNwDWfRj5uf\r\nQtHQk8kpAHOPdvUnAva4nCyKuTxpVGUek6LBnAhW0E8ZUKIk1lhAVfgsjqJ5\r\nVHC7ppYGp7c7jqasWuciYpZh8U7C8RuGhA3blWpWNOSv1iqtBr8QnTfdKS5g\r\nKngyPWGe5s0/PXXWfID7PscgHZY0zFjf4QQ=\r\n=+wul\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-pg_0.15.3-23baedd_1673892323760_0.7208549691006036"},"_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-pg","version":"0.15.3-844cb31","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-844cb31","_integrity":"sha512-iXKgVUwVKfAzG1QA28KJbY+HvQN8xPGJuKXT3y+oeFZZuDl7znhS6RQMqrzQ5KTkr4bQuawaZ4Ren36uR6kXbQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-iXKgVUwVKfAzG1QA28KJbY+HvQN8xPGJuKXT3y+oeFZZuDl7znhS6RQMqrzQ5KTkr4bQuawaZ4Ren36uR6kXbQ==","shasum":"6d7feb46dca049002ba184e38c2d9612aaba8cce","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-844cb31.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCUnbTJ9l96KWU+2cqOd8+Exb2ros1icwniYqBmmaS2KAIgFRyZBNiH0F5xpamkVf+8+ldRsnHwDM22a7FtwSkm1Wk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxZvvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr+ThAAlOVsacWGWjuoWgnMhp44FdSI/VTvOBCmIGih9E8/grhcAMzY\r\nnQ13iFLBl3/n5xTNoIF1imkGEHfSIPyrEs42FAYmjXQeogP8DDSszRNcxrg8\r\ngv4uaS4LrrAePFPl22sYjIb4tFEgSLpYWO2eTkjgrS+l1LOD7CQwnCrU9POn\r\nSgAWsV6PXfMfI0VJ15QEHnr8Pr9Sz7Ev4ZvggsLd08CFAaFaCs6I01MdtBhf\r\nI7foezVwjo1JBGqHZ2tnaCJWGBA1Mz7QxOqCPFaQ3vfHJ4NT627Fy1RFJ74I\r\n5ge7W9R7BUZl7o/I2ihT0zAzz42i2b55R1DvtqYwzmbknuQghuB53pqh9n4z\r\nhtCYubruo9x73j5qKX9owOeGCMVe9RJLMUGpAZZ3U40ZYjNIus9usB19MznN\r\nXnF22zr+THQHmuzekDK+dKk0Te/p+oD89qELa+b6jcPxCiCshK4pMCv1dPJg\r\n0ktdiyby8vox/XUu7L3y6vRfJs6S1h7+VtD+xa6yzWBf2Mt8cQo+jqDcymgJ\r\ntAEp0u5GJUljxP1f3G8KEhIFPhoDVocx2WN55AUnIPn/YJsXAZQwCavF22US\r\nhwuZ8UwJEqUx36GlUZkLkc6A1x+NNcW5hkoqC2o6c9b7zOTyqwWG5RUm6+02\r\nFrx2zbFXGmPFgnzLdh74oMbWKFb72CMZyYM=\r\n=OZGT\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-pg_0.15.3-844cb31_1673894894853_0.7045085942003522"},"_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-pg","version":"0.15.3-98b2097","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-98b2097","_integrity":"sha512-fJFlHHZDlp11ou6FbuIsXeFnhgibyWdXcp3boAuOCN8In6YQqx10QrhmaoyB+1IrZqGDGXUet3tUnwLizKSq4Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-fJFlHHZDlp11ou6FbuIsXeFnhgibyWdXcp3boAuOCN8In6YQqx10QrhmaoyB+1IrZqGDGXUet3tUnwLizKSq4Q==","shasum":"c1098841089a9b9d513f17030a02f821126e5b72","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-98b2097.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCXNSVaysRk0yzYRvNmBfT6FRitSM86bVY+cxdfgfX0rwIgBFh2SGniNCYi5tRcuPTQqE8dsmgZe3KzpStV9KeZhkI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxaz2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmofSg//XftmK2ldcS5PMNr6W3MYIl4YZx5eoIlcjvyL743PyY4Q8JqA\r\njb9Ml25tbRysFWTSTsAoNAtr1vPid2pGNE7fKi4iSzqhnFp4BhVjQQP+e//k\r\nTTzC83VXOs81eHNGQu6ha3EttKtpdwBEfCWEONIHKhbJxdFrUUH0IhpVSxCe\r\n1/0TvEfqj5ZtXX5hnP6n4TioWkR+iNcPqNJRCrrBGD4IOyp/FLRWBrfGKpKC\r\ngbzU5OyvWQfZP42OEQauvF4IH3+H3Xrs6g0/EmtGbL/LXfntTC5w0umws+Q2\r\nD3GaW/HlnIYnSY/BXK9oIami8E1aLlZ02F9/6gC01zgZ/DpswTBO+sqXueW2\r\nQwNw07WGlUmlLPcUB4Os+xncJ+jTiApZRv56I0/iBDK6k6O3VR7i7gbu9O0V\r\npVdYL/xCu9bn8gLKJoFRfxOUbRzTV/oWGV4TbKF/lHzBcdYLnpxEyQ/pDl98\r\n57TPU832LUjXja2AFbDp7blC1J4j9W+U0+x3tnXjRDEJgMInCuhF7pQLu8/+\r\nLA8Xnxc+Jv2pT8UWc3MofCWshUtl9F7TOL9NIeEYPibjhhPpBhjmmswAiLhO\r\nFOEYT7CwPwTsXKbFola0X+/LKUJj/76Cj4NWtqVTkE+6xcp+78ZdZpUPUTbl\r\nx3IJLXcZLmrFShYAwUdU7MVacwg4jjd0wnQ=\r\n=42Kb\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-pg_0.15.3-98b2097_1673899254477_0.020469294094012103"},"_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-pg","version":"0.15.3-0dcbb16","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-0dcbb16","_integrity":"sha512-4ItATuemeQmcF6JJ4CPhWs4FQICYIfs1nNd/TVpCAWpmEXqa4XmzUdj++MLuKjttQIWquwp70GG4iwO+CMf3pA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-4ItATuemeQmcF6JJ4CPhWs4FQICYIfs1nNd/TVpCAWpmEXqa4XmzUdj++MLuKjttQIWquwp70GG4iwO+CMf3pA==","shasum":"93242d6932b2abced219ffd7acd3429310e92728","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-0dcbb16.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCzxxdWSqk4c24YVdn8nG93rTkLwyzvnK1axa5fzX0DOgIge7bsxwG+XT0Sr/Girp/4JePgIGSaATjddmWq7xfnORU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxa0wACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpEXw//XlE3ZFrZ5NQ26qpYxIeeeddNhObY/PI/6yCc1lLYCUJO9VKd\r\nNjouCOTG3olwFswce3U9VBztjh5RCoUKZ81KnwF55MBiVQVgyR5RrOoRRSVg\r\nMmKrFFPWXHICW9CQZIQfYyvlX0v3MMHkDkMZZyDPurnvyIx1G8hWyxDy5HQI\r\n4m+BMwRZ0IDubXcL0xBNbqM8NMFfdzsuskiPsacRzAsIR7Jr7NTxjSutXlaR\r\nMtX7NheouRpiIXgVNxfPnfIAocgIk8ZEBrmCXXZE0Jy6oGVLXO8UEEmpFdVa\r\ne0zwWmPnf21lDDyv0KqzIzS8VR1NMKm6PdmIFaZY31CcOSRZp7vCiLBpeCr6\r\n7b9Qs0lVWfdd4G4wCbjGjjBZA5Y1hjWLw5Cyvf4IArnt2++RhkoDMQIED8AB\r\nFX1W+0GgUEiiChQrCyP5ytHb5YNHtwLRY0m6zD+ksevQReG6ndL3SIulgXpj\r\n3qGHx/WIZ1h65j8s8QyF30dKqCUj7uxtAsE+ZT3CLyGZxLCdRHczhl4P+WUS\r\n620YIlVZXs5Lnzq3CrAcsT67k/nmJSp/MdD9rxRp+HuCYfMq3GD2z7f6Y5vf\r\nc0gbGfoUBKPRQr1xIGpE3UCyiu57iwj5sqt5QVd/2sObH5k+zCQBVfApadHc\r\nwzOaV+++NEVSm4fJG8UV569qIy8uMvWWbJQ=\r\n=mhkb\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-pg_0.15.3-0dcbb16_1673899312463_0.2066058079492401"},"_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-335d188":{"name":"drizzle-orm-pg","version":"0.15.4-335d188","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.4-335d188","_integrity":"sha512-Hd1NPC91uit+8vKthZMT/JstqYPcfGPXyVHh34ZnB1QVPnQaqxKWqfSO2gZWlcQ1000DahdZ2x0q4UgwRc5zrw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Hd1NPC91uit+8vKthZMT/JstqYPcfGPXyVHh34ZnB1QVPnQaqxKWqfSO2gZWlcQ1000DahdZ2x0q4UgwRc5zrw==","shasum":"c15b86e54fbcfbccaead7f6b04f0268544e82b2f","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.4-335d188.tgz","fileCount":202,"unpackedSize":293458,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBy86Hu2EN7+prC1aGQmbR8kL5Psu86YPiuQb1tirfd+AiEAh7IMxwhaDrphnNKRVN9XTg8FdcA2lms/Lb9bjQZDRa0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxvhCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmosqg/8CWMB+sCO8NdvOYiia7z4RV3oIzUi3Annfx+GUmIkj+hQIr2s\r\nKzoSx49aqZZRZpJfBjFwfXiIyfzw9buTWHljJG+H9UaxnJXwoqEmZ9NoI2wJ\r\nWS/5YN0vQzO7A2LnUUjIWyYiDsYtGkXEcc5q9XYAdBl5T2zaNlCASOGuOUmf\r\nSXTlOZcBSAKJzx8ZAnD1u56F8u2yidzV/itABzhZcI9jaLKPDDn0ZRyVcs+j\r\nLCIx9Hs9PVUodHC5LAyTojksozlb3xtX4CBad1J2Mur9nIdPZlyoRqnstusd\r\npYV13VAeiz6jDYgR7J9DKINcalfRT+qYxx0NDnNnxm/DThajXnWfCuAuX8La\r\n2LFNGbcRRl4rS61Y8vNqMD9m3NVqp599V1FDQtGBA3K9HqmDLyNHc1JcqcEK\r\nSXvc4XH8TgQzvaFwnfQ3ewoczE7LwW7vphKdspLHfm5bgqCliHM+fFUMPh0w\r\n0NbUeafI513PFOfGosLT/cz4fnvYqqV5SXefFe+RoIpz//4LgR7j+oKZ//mY\r\nA+QFNbDzfrkiS9VNwv55mh8c93Rew7oUwqsCkogBHuZ1ELd/53MNb/l3zf7j\r\nYgepW6gbjIWNyUm98Rd/lg1VcmiyjZNnBjdjyyVTHlM6UqpLdxVSgXiBVbpH\r\nNS96JHVkYeJ8VthZYOMgsiCtuRG1xcwdwis=\r\n=nUDH\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-pg_0.15.4-335d188_1673984066301_0.7771030861521266"},"_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-b422bc1":{"name":"drizzle-orm-pg","version":"0.15.3-b422bc1","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-b422bc1","_integrity":"sha512-JndfktkQSDvlZ1mcyfKH8LK1e9DrKZrNTsiKCTPHr9boCLDNAzjEt+RCYhRJr3EgjJQRI0v8I2uYgu9V6qGL4g==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-JndfktkQSDvlZ1mcyfKH8LK1e9DrKZrNTsiKCTPHr9boCLDNAzjEt+RCYhRJr3EgjJQRI0v8I2uYgu9V6qGL4g==","shasum":"5c193aa4eb92419168cae8d002feda3cf5971f7f","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-b422bc1.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGRe/nBLkhVaXwFTiLpQemqN2WPXqSomy81jFDcEf1jCAiEAtslMocmr4uSHJzzpSEgQg0FwZbRnS1yW9bsvBKoqSQY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBWhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo/fA//U63L581i2tNvlLjdYGPXOqZUogGQN3Ika1qQRq4aUC+bHlnt\r\nBNS/dblAiIVJmOFlSvhr5VwWrulovFU+aWW3EWW3HO5N1M8IfyD3RkEtsCwZ\r\nX3fidMx6U7hJzy3/VWtF3wUxdKML2H35/q9Sz4g+NZu20/MUiKUnH5jfO6g2\r\nGEAjbNGa9DtxwFbhnUi7j83v4OIalqMJnOxYoaSXC+6HfJHJefpmtaKHtghi\r\nqSVRHLu+EPvPPY96v3rvMVBviWwNP7ClaHKYcxSUcXiL+xLxeGeS7FW0nSTh\r\nrr12i+wRk8kAyXIWT7gC9WdrCZ+Q22e/dVYCjnOy3kDdIB5G1Q6OufaHNMsp\r\nFVWshnqjLEajyvAAeEdMrxMhlxbTJTA2GQQB/faqPNdLaXMoSJQ2//2qVoNL\r\nwom85YrspPu6PaE7PnGD+XtETg2FJEyhI/L/cFPP2Xtn+E9RbFo72mylZm/9\r\nmuKdzSyYmjFYbwmECndzOSLedq5txW6397EZ2QI3RuogeyDxDignLmud9s8k\r\nUV5P4yYRiSvRYS4BWXJDd34NBfc9NVYR5oobWAYq8dgj9kabWMY4lND5TmUz\r\nEdAvNxNxEsEYyLKycdg/Tt2Jh7fTZWZzZs0lVhA/oB69SQDSB4siqKZ98cax\r\n3SeY9tbSQ91oLHScUZkvwnYa20N++AC+ytc=\r\n=xLwo\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-pg_0.15.3-b422bc1_1674057121293_0.5991683133295385"},"_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-b3dd40c":{"name":"drizzle-orm-pg","version":"0.15.3-b3dd40c","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-b3dd40c","_integrity":"sha512-fvUxwZt8MkrQk4BS4HjsEIwcJgfa10JTkrr8ukaYdtzvlfLa5p1Yg4zYRhBrvn+8ypzervPZKwn4MpsZtl4vaQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-fvUxwZt8MkrQk4BS4HjsEIwcJgfa10JTkrr8ukaYdtzvlfLa5p1Yg4zYRhBrvn+8ypzervPZKwn4MpsZtl4vaQ==","shasum":"c4eedabe8338f61125a23acc410cebba9863c920","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-b3dd40c.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+MtgKlnvWU246i+uk1NpjvSMj6miwcoNeHDdYBnGuaQIhAKX3r6ZMUIy8qMMX5G9rBp6TKicpGpljuQ0fTJGI8QJA"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBiJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmovJxAAm9PKQZDYQU8Gtx29/xiga5dHHNiye/Rks+F8Y8kKunIRCPne\r\nRZOY/R7MURxHwugWScEPOkpWtBzg8N20QNv19KoPGELz4LMRIfs036aFz+EU\r\n8co8vKGnKvy2FrnrOJu0516sLIwYdc4wmfGVY+4kr2PAj5j8n1shF+1ZRRhv\r\nHG/mP+6GRn/J5zkqh1FKXzNniuJPODSwUBKnGtKMnZtJ72JBCcJpUzt97Ya/\r\nkrTnMyUi61p+iG78yWk7sZB8ga6IJLCki/xSYRgshlfy6knr74sERdQBj2yi\r\noe32via7viSQ4sxuPAWHsjcEmAp4BVRQwutAVdxkPB8X+XCUHX7Bour224VK\r\nVxxCoIN28h0blzebkyRltuRtSCrWjIl7fGUt07bT60qCBajADkQrjb6XSHtr\r\nerGifb/2necaa1qMtkGFHN6S+/rt+t9nEMyM2v6QmtMlfsVzvkrDRjrh4bF8\r\n/IXUhMz1EaqrtCIgmc2Sr/8QwrL8/6lG+wbfYtLFUwT0JIKxISxN+lNS1OQB\r\nWEwQ9eN+T15y/YpPx4n/u7/oM3HhKa348Ogrd1x8jGu2j8DtPqowsdSm6TyM\r\nEK7vJXwA3d+STwhbSLKryfQsO96BtIAwOY1V7oz1xO+56az22cFDC1qX23Ig\r\n0QCxTyrW1oA7gklJ77fdwp9wV5m9frm8//4=\r\n=9Xcx\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-pg_0.15.3-b3dd40c_1674057865085_0.9991608951873987"},"_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-71be15e":{"name":"drizzle-orm-pg","version":"0.15.3-71be15e","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-71be15e","_integrity":"sha512-lYZda53oyIqBVk6OELd6VFTgCu7/d3ZkgWdoxvt1bm6v6CvohFOQrECJJPrsCxixq4WNxK78qBHQcEVYZZun/Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-lYZda53oyIqBVk6OELd6VFTgCu7/d3ZkgWdoxvt1bm6v6CvohFOQrECJJPrsCxixq4WNxK78qBHQcEVYZZun/Q==","shasum":"0d8f96492e57704a44c5acdef11abd197818157b","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-71be15e.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHC+hWvLAgQ1O5DJIXiOuvTiJL7zXyPjOt9Yty8EuYoGAiAMPa/OdJMUdCiUulkpcwMgfj79Y/Qmsp2ZHjr2OGaGSw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBw3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq9Iw/9E27Rk/5vu4pL5LskSpIV1zUwF+GkQtSfeQsiGkhklVj1KmU2\r\n4hsmoWmT218WIGATMucq2N9GbyF+79JdEDShiyBrXPMFQdrZ3gqYxymd5eBN\r\nbZtgBCPeZSw+dLqVLgNPSyCoIu+HHHY4H1Loh3CdDup1PC+a/i8pimrMeGlO\r\nqcG4qfujV/L+qsmGvtwQcAxO7yNbrYmQTUBaAhTXL6BibHYtXF/4//dGl8la\r\njpPSE8Ey3lzVnA7J5PI1cVpN2YpKbpK/umz3I6apUQJDn1Foi1vDtsIMTi9d\r\nrrQRuch+oDccrUiHJU6sfjUSYnKQOOm4Two66h3pXdYBFrGfMYJ+7UaZgq61\r\nw3sWdqu52WpaaBciRX6G4P3H7dHPhm3nJcfJvqPCFmfd9QY4hno/OlXoO0jt\r\naWQfkH64tCz7AMlU3FhQ5lffa/tZE94MEQUqzsvB1OMqGxGwuAWK5CAtbWzR\r\n89eEQNYcvVuwLHUfz1Jwc7py8NwJRyyR6F2svpd6Tvh6zruEON8oab7EcxQC\r\n7cXvagwPl31w3driFpIJM1+w1lRPYNZzIkSIrLlUgCvz5ciwwcbLt2qmNB9f\r\na8hDajG5PlTQ9x7WpS7rHwKWmSqoip8Ka1ENK/Fw8UInWZrHr0xYvX27PRf4\r\nv56usbBjoOQfEh+1ih0Vn8XOcyRJLsR7ztU=\r\n=f0Cz\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-pg_0.15.3-71be15e_1674058806807_0.4415295264808079"},"_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-30915c1":{"name":"drizzle-orm-pg","version":"0.15.3-30915c1","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-30915c1","_integrity":"sha512-u8ONIfKwbWbjPnA+5CzApqwPgmoFanhjBV6AqN4OXKcoKjHxQnp51nFhNBjMY9e5R2xxRXXhEFnupymRufEm8w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-u8ONIfKwbWbjPnA+5CzApqwPgmoFanhjBV6AqN4OXKcoKjHxQnp51nFhNBjMY9e5R2xxRXXhEFnupymRufEm8w==","shasum":"074ba7bc73dcb1da6dcf42ba20b67f62a52c39a9","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-30915c1.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCsN6lM2OyeDHIweB3Yx1tmoPYIdekhHF41UDYAmWmgUwIhALw2JtsDVJiC4h0WrQ2k75S8Wl74l96X/emPOEfXeaLB"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBxZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpN/w//ZYSuAVGyesZGS7IiLxZmaN0+WKyzh60g8NtTNYIkXY6IT0X2\r\nFubx5z6yZ5pe6t2EBTw3vwRCzE+VuaNAiJVpUVHJ2q5ui44NhuUy/H5Cud4v\r\n/nSSevOz+ceeb2OB7s2JxdD9iDkEZ+x0pcQDP0omtTjNL1kvIA57XHx6KOpU\r\n3Tr2XhqS6jIejwV6D453TOl7KCdiJi/U2Y6+00ZzZXHcoAgFco3OTXT2JG2J\r\n/MtLQs9I7z9KQzDI9/ZqaVXD1+sr7N4kufQ6F3WquPINiFNzT5HHZBH5QEVi\r\nHs1ejfFnzbTvedSvZCuj0HAOVn16wJkPbYBVorN3KjeD8BvllcRhsiqUwVl3\r\n5Oe4G7//nF+MYmuxtkrgmgoz+VAYZmiSiHTPWsHtMoKpFlf8Ptoh3F7UME9t\r\nHQYGeFrW46SQUiIl+YC4P8v3vnavdUr/Aa/tRA/fuc0+nUM5Xpn6+/heU5S7\r\n5QEJj7wUT+00zyQnVN9RrYEf3PW1K1S3vNT3yDCNKg0TiJb2IYSWg2jj59t5\r\nggSL5BaFGoC9lTT4ML5wX4s15Xw+ZObMQ0zJ5apkrnljAJRfRuoml8AJ0Bt6\r\nG7ICpNHSDzr86JykYTr9vVABWqcIaxYFc0LiKXBgg6oyDguu69LEl2vOynar\r\nXVjs4xyAjgzOLEUOb5nbpfrSznHUNYyfO9k=\r\n=SrCa\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-pg_0.15.3-30915c1_1674058840772_0.8389268604582607"},"_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-36368e7":{"name":"drizzle-orm-pg","version":"0.15.3-36368e7","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-36368e7","_integrity":"sha512-2W8e6gAfzOQgGoytS+0QeLsMNQrZxEjMNWOoGybDmPTclxnAdwpMltzrMRH5iYyH29PnkMLzz20eHsj44WqxYg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-2W8e6gAfzOQgGoytS+0QeLsMNQrZxEjMNWOoGybDmPTclxnAdwpMltzrMRH5iYyH29PnkMLzz20eHsj44WqxYg==","shasum":"242e6c9ab84d6be967fc6a7484c2707c57d808a8","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-36368e7.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD15ckm3JtoWT9tKF2R8DHSkXBfzn2+XNENxR9fKH4BFwIhAJljhJ1YhTT8bGfcWWD44Z723Xlcv5KPavLQl0mVUlD8"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyPwfACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmryxQ/+MIDbptSgeBZagEm0WX8+ug5YnamTPvVwkRejHSzr2/VB4W9b\r\n0lrJICpuVt07g68FMa5RAeR9sOEbaAvDNKEmOcaF6M+F52/QCUlPYK0UEv6a\r\nJH8YOHNTS9PIioBeUN3PhXLa3XAq2QGMRq17g8Yqf2Ppw3nb95K9u+xJ21xa\r\n/qTyn7C5u9vVJ+RF5OVDewe4xoEn7lYtDDD5pL+3wObyq/vKo5Xo3RN3qB5u\r\n6oTvoz97Z2WKjr5CPOpUHgbbEE1aD1Xy+eg9CWWrbQiPsYASuY2zXa9EzfX1\r\nAhcYWxB4TPRv3hcVdJSHyFWRhRbgknGUg9DWNkGUZSfI+Qi18e71jOXJHfEa\r\npfz51OKv8qXvpzrN4Bh84JgLeYuBXSNpRYBbs/JV44q+YQMCvl9VTW1+vMgE\r\nxM/IJBwlnkLXmLptBWfotFMKKcHS0bfH7XjSOLWIAl6v5W1zpQtjcU4U67xS\r\nAps+QfIdO8gS5hfPpSrIk0ze5RtaBYA1MaioxyWg47oyfa+K2FWsO6kMmXrf\r\nbbRCdBvLu5jip/LdLBLQwqfZoMVK5jd8J1ZQwbf5zPXCgGmnMIjbRkPr3T/z\r\nki9RMK2V1C4p9CHTnNMxEP88FIXKeqW61G1eNWYuQ+AxI8DPxrTiXeHCaZ2e\r\nUM1XpSsjgFhZQSJ9O3uc2/dOirm3TtNsmio=\r\n=qil5\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-pg_0.15.3-36368e7_1674116127704_0.6368081477446479"},"_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-pg","version":"0.15.3-adba448","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-adba448","_integrity":"sha512-HvQnEr+CNkUUA90YzZqwUA4jAdp8D2xBhFV2vHqEUJ4PFpflq4XvPrkiDAKxU1tHjtnk7knlIOLCYo6BhSR01g==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-HvQnEr+CNkUUA90YzZqwUA4jAdp8D2xBhFV2vHqEUJ4PFpflq4XvPrkiDAKxU1tHjtnk7knlIOLCYo6BhSR01g==","shasum":"8386f13b17d7df81193c6130b32b733d73f3793c","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-adba448.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBhnycQEVpP63eykMp1OpEX07bPhg28zjUglOBntjxk8AiBMLt6xnoDYpifv18ZkIxFAvLP2lKwhWzUIklzDbxCNpg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyQnYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrwIw/+MC0t7Hxr3A55gXFJJQoX9OiCmcQjUWRa/H4g6Tc1ryGUg9DM\r\nbK8HgULZ6VkJp6oh6OgMgBIcj7A1oYxXUalv2qN2f0ByLh4LJbBH6fyGIEPf\r\nlxj6hQqVdye8SCxjnrUesKEzRFdUy+QI79xx2P2D53qwR8l6MzE632cHcAx6\r\n7dF29+xV1YNVInrAHlT78waa+6DX8Smk23dZZSRGlM1Mm7ak/6i6fZMjqvwU\r\ntvoYUKiKwXOl1t3WwnZWR4OP4wgvRWhJpqlp6E9TRQowGRQobXtUKTDnFGo3\r\nOLk3LO9vPRh/1XVW6qS2bWZXy8DXdwkXx8DUYM2jqcjKQ3YO7J/7aAt7g6sq\r\nL8/YdS7h1/SiKIcTGEZCEUgVSBtARG5hAaEXg9N0t2lCQ7wIt4ZjVMQUSaV5\r\nCUqNwY231hNe+heq9CueEeXJ9IvzLwXLz+HmnMba+WDiCs4ixmEKbvPKFKGL\r\ngoORz+nr3BomgPq+KhL6THaEKeDxWuN2innkB7/gAcccYZLygCvQESTItQiM\r\nuyEi7ia8hollA1stF4lgQqRh6DfFyAnHQ4Ew3pdpBIw9fU9vhF7j/9ImuU5u\r\n3KTh8M3Dm2avguBBRMVJ813GvKJokMsnOASjj/sbE4JilAQnNctSqEzmYWzk\r\nRE9WxmMRlUXDycnAaDMgr4HJSgfLvZZo034=\r\n=CPyn\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-pg_0.15.3-adba448_1674119640065_0.432829934007092"},"_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-pg","version":"0.15.3-bbe577c","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-bbe577c","_integrity":"sha512-swEB0S5Frlz/WnFzH5ZJ9cCg3dwVr3pE1vbnliQYhRCd3r4fn449LfDO6eNuqqsmPLM2GeiHGcvqgoZsPVdBrA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-swEB0S5Frlz/WnFzH5ZJ9cCg3dwVr3pE1vbnliQYhRCd3r4fn449LfDO6eNuqqsmPLM2GeiHGcvqgoZsPVdBrA==","shasum":"1effa8b9d8a0b5dbb3150b0b1bc7ed4bd8664edb","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-bbe577c.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNPTz8W6h4HG2uxFrdFn0cV/KCBYLGk4LSUfu08HP5QAIhAPVh/oUylzECXe3+ak5ZVOghtxXoH/sfdVVXYzIlgTW8"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyRe5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpj8g//bN2KiDl1ghprgAvTPk+ifhs9SDa6ujjYf4p6Iv0doAw64/Z3\r\nmw05ty+raktb2VpQeo45b/fKWEZ1xFLIuAAZrncEnC4fXw7WsMKVVl2fekz6\r\nM7SfiQZvMKTySqnuShpY3XjMd5KBPgL6Q73nXcvSuJgW8FRnnItsm3jqZnK/\r\n0TO7LCHCXDOZUQ012u2aZCdzKG6jv1fbi7uyG/GyH40CvAghnCeGZrkjTz5w\r\nZgoRxFgNGvyiU5yFJiRAYdZhJErw92p5ZrreWZ4VW3RHeLNeCCZnlWaPUVkm\r\nIxAiKrvWDaxb7gwsoOOC/xZB0aBGhoJlLrCSlOLdYcT/aCr8W2mYtCs4JZB1\r\nBD70K5Amxftat06v6bJzTDkbkHAez2VZvu2CkAzRhOy6338ABqQ9XAQNeJH0\r\nnLJEICR2A74hY3orgwcooPXUvJm3YVv1Ly3xQncvOfJ9IPl125+riop09LR4\r\njpj5DNmAZSGjcO2j9GBwCVOymc7t8kngNdcxEyIgb0cxZGRWBafW3S3XdUG/\r\niM3rZN7yf/9G1uGWDcUcCWk/zAyNDKMZNez6tDhVi97zRqpYnqVezcN1ccGm\r\nhHE6XAuCOAV94iGzSkc25R9I8OBNE2l+//N2pezHC90Ko0bBmJwnwJJvaf50\r\nZIOBiw2exxW4gSZ4J1EjFWhcXCXBZdC8VpA=\r\n=EJN2\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-pg_0.15.3-bbe577c_1674123193245_0.848766995107239"},"_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-pg","version":"0.15.3-1c43305","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-1c43305","_integrity":"sha512-lfA/jCI5DxgGe5HnIfxwx12eXy3gfirTskH+nMHFS6oVNrEA5Gb/BlctclhVhxyLlfMoTcqfCh+gTuhk0imPCg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-lfA/jCI5DxgGe5HnIfxwx12eXy3gfirTskH+nMHFS6oVNrEA5Gb/BlctclhVhxyLlfMoTcqfCh+gTuhk0imPCg==","shasum":"231bf182a2fd85dcfe9d9cf75c92f6abe9db9564","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-1c43305.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDEw4pqaVs5CjlU/qZ7DRwv373ls0dg3sMBwu1kz49aJAiEA6rb5ZNkHn6gFGw2GKCNyNfj/22jy6KgnFgnJUH0YS7w="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySJWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpH6w/6AkOVI3G0MCzG6TqqJ3hrYQzCBwwr9RfLEpAcTa90aIvUYoIY\r\n9GlCVJd63uBIJz79Wblm62ZUAjn+2L31X26xi4JHe/cQLqkvreibhF5xll5D\r\nlaD3bQJBKb0dewciPg5qfOnqT9JgWjPC3liRNpCjtOR7oezrZXeb9IGHTALT\r\ncDUFm7uJisFwl8R+UEJnEmIymjppKNjV2Mc4+/ITXfSkLp0CuSV+KjQh3+b5\r\nAXV4yW/4cBpzmERPqtswyXqxtd8zXER4UaSjfHto7rsWydB96W1HQZZTsih5\r\nSaAUbeLycEOAwzf0uF9uK6a5vUBrqjIsNwDIgaasjkAqwO5D3/z/2HlYWMmQ\r\nxXoI01hx/1VEGM6a7jD+BAMniUs1vtdVilPVcaDQlxeWBMKIzEa7Mgebwyx3\r\nEMZQ2SP3KyNOp3gCwZBhH5bkBzhjWupinAglkMr9BYusOTbfK4gjJo+dFyUs\r\nr7PXJe4T5KtkorkNIyIkwjDcKT7lEUwUK2Q1yMkPwpTMKOeVtI2Gm7AWHGz2\r\nmPat9YITf/4VSgXcNZR29l7GFkfF32hHs1TRV8/ud5nHpSNVqu9k2iLuBqIF\r\nkxD2L6ZM8+A6aeGbMudkNynSYPHf2DMaU9tUStx4f8MNPkbIx1U58vvOVL2T\r\nW4MLXfKXZNGsXjoXMCd7lgVTXdhRf4Fze3I=\r\n=C4Da\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-pg_0.15.3-1c43305_1674125910567_0.8035457780866679"},"_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-f77c6c2":{"name":"drizzle-orm-pg","version":"0.15.3-f77c6c2","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-f77c6c2","_integrity":"sha512-e/R7uxnue4vgbukr0HxB1Dqq7w6f1PijdITi+xzE7FhRH7FFnMn6blHpm+JJbndNB3VoCVdfosq56NQXCS6IHw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-e/R7uxnue4vgbukr0HxB1Dqq7w6f1PijdITi+xzE7FhRH7FFnMn6blHpm+JJbndNB3VoCVdfosq56NQXCS6IHw==","shasum":"c0ca12fa2fb2286f15df73f51d479de310c67a12","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-f77c6c2.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEuxogUOggmDgYjaitzuW6SsBAnthX2onmvX6xwks7lwAiEA9++o9dmeQD+ddiNyjWq3EotUwgXttN3erXE2cYfKPx8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySMmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrhMRAAlL7lJ/+71Y1vmRaEBUqTI/srbos425+CPTs05GJh2SNH2ZMi\r\nh16g40Wsya1SuIuu7YUi/F8BHrb/s2JrDxsX4bEKplmHMKZFgmcRjlqvM4P2\r\nFakBhYwplZXcckiOVWB5UtgD4bnMearct/Chqo5/7g7V5LduQhbp/1I8s6/l\r\ntZcT5tCMblCABHNn3PaWaTNzdPdoSRuakvU5y+MhIDpsZ/CEMLpxtnNuN4Se\r\nqhoAHg+BvjK+hBLhReqmi8FdGC4t4qc9jVsMpzPyQFWciOuQLE0SZdwjWrYd\r\nIDPxRzm+aP/j0rw5PZMukxl30/kAzA8t5oYxdv1S9VMD4So2PCTx/IA9zA6b\r\nS2ukS+Ig3IypsTtEuHINwNnbpEziEjNdAVJSMbE2NAykup3dD9H311Zkv0qb\r\n6PtSGb/Ig+pKAmHSB3Eq29zG+IC7dVoFrm8l2U8w8N/c1ririia9UrHn1dAa\r\n3cUhxeidDgkZsKw5V0+TR/h1pN+5urjiXwTjH8v4RA4vrSe4WM18m5P4FLXb\r\nl7s57+OIGQJPoaRShEPVm0BKYL0UJIZd1gCouV3rVbIcU/VuagV6ORdPVOKm\r\ni3QxZHsGwkrsaBxiyaMgidv+9DN6AS4ehL/xD/EZYb4QqdE13vtuFpU697WR\r\nQJGa2htDuasZMCOAvWdgUS76n7W9BMxgaTY=\r\n=Nenu\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-pg_0.15.3-f77c6c2_1674126118274_0.6724459369055062"},"_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-1f6c448":{"name":"drizzle-orm-pg","version":"0.15.3-1f6c448","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-1f6c448","_integrity":"sha512-l3a21AIMnXtd5Ib7nigTHIBwzs8TUjdsa6HVq7GNd+WoLHXhkrHKAga0ilItVjdKzA+/lVMzVOGMoAzlSca0fQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-l3a21AIMnXtd5Ib7nigTHIBwzs8TUjdsa6HVq7GNd+WoLHXhkrHKAga0ilItVjdKzA+/lVMzVOGMoAzlSca0fQ==","shasum":"5d4084f64ea9b51c4a4ff780ca4a29745ba46099","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-1f6c448.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHYtrMfpSixX/RZif8a7I6tzrwWJjcKcDQQKTRuYDlKhAiB0w4mmC/O/0MgpGUO83tr1ESMeC0k09c0E5mASFPBeig=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySPXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpaSg//d70PzAs57BgGet44Pqehtjh5REA2Y7Gl0GJdW5heJSb31DFA\r\ncplLRUr4dLe2B1we6i9dT0BF+Z78kS3gJri9Vybdy4Z0b86hRaWsII+JVPNG\r\ntL/qrPDXDdXgtguxt8vudGTwaeNE3YeQSC8QoXX7L/jT5ga5wgOIsr08snM8\r\nG96nY15R5AutzC6FYK77cWXLUcXRPpv3/ST6N6HyuSFTYvR3ra7HXf3Sbs6O\r\nubABQVY7Utr+mH5sPVhh7mXOvW4DJD2gL2SoKcaN2gyXN/bNmJU53NseKWQq\r\nT9AG6nou2k3ONNJ7G3x3AhCUHQJv+u9ItnSaFOo2OwIm/DiLTnybKLCzPuQr\r\nCb0iCe61EQm+Ou/rWRgTLpIkEFjNcM8b2VtlguZhH1lEXmItOin6n2oEejn6\r\nOfR0K8WR8joQsumAJ7b/NeJSidqZPTAjLCs8TEgJ85phm692CpNQgukxjQP3\r\n/pSZFlSNmqXK0+tpFgLu7fOZEQoLFJUSOQkD9Qa3/koUoMP5TeK+vLpX33CX\r\nAC4rQBU784B2epWbwEXtmn5e5Xud0muKwjcYY/56saMd+erotYeNkeJbZ477\r\nmUB6k437wxb7G3CkOqVsCztFHPM+RK5zJs3JSJNBNoaSA5affG6ejmxk0bfW\r\nmMN63+KCiCZuFZwxhcBvBFNR2tvwE0BRuVw=\r\n=MGCd\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-pg_0.15.3-1f6c448_1674126295414_0.4988435069224735"},"_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-d8f67aa":{"name":"drizzle-orm-pg","version":"0.15.3-d8f67aa","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { PgDatabase, pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: PgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (table) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(table.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n> \r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n\r\n#### Usage example\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name').notNull(),\r\n\tverified: boolean('verified').notNull().default(false),\r\n\tjsonb: jsonb<string[]>('jsonb'),\r\n\tcreatedAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'Dan' })\r\n\t.onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n\t.values({ id: 1, name: 'John' })\r\n\t.onConflictDoUpdate({\r\n\t\ttarget: users.id,\r\n\t\tset: { name: 'John1' },\r\n\t\twhere: sql`${users.createdAt} > '2023-01-01'::date`,\r\n\t});\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n\t.set({ name: 'Mr. Dan' })\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n\t.where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n\tcityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n\t.leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n\tid: serial('id').primaryKey(),\r\n\tname: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n\tuserId: integer('user_id').notNull().references(() => users.id),\r\n\tgroupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n\t.leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n\t.leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n\t.where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n\tuserId: users.id,\r\n\tcityId: cities.id,\r\n\tcityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n\t// Supports any level of nesting!\r\n\tuser: users,\r\n\tcity: {\r\n\t\tid: cities.id,\r\n\t\tname: cities.name,\r\n\t},\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, 'Dan'))\r\n\t.prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n\t.where(eq(users.name, placeholder('name')))\r\n\t.prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n\t{ id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'phone' character varying(256),\r\n\t'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n\t'id' SERIAL PRIMARY KEY,\r\n\t'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n\tconnectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.15.3-d8f67aa","_integrity":"sha512-uD6Vsq6zf9FO63VnMvYkLofNkOicZ4PvrhaVpFfpu/qihvIo4/xGO41zzRU6BA04pDkqrS69mKFAi8hWdx8iHg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-uD6Vsq6zf9FO63VnMvYkLofNkOicZ4PvrhaVpFfpu/qihvIo4/xGO41zzRU6BA04pDkqrS69mKFAi8hWdx8iHg==","shasum":"180ea8d94359c3bd61233852decc75fa4064b56c","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.15.3-d8f67aa.tgz","fileCount":198,"unpackedSize":289756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCZTvJxuIxVRI5AXpXKAQE5laaYb7IVJmpQ0MvpYuMAngIgZzbQbDYh0btjXNoKXJP9mKiJfKB3VXH8ERrZZJYE+nU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySSXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpooQ/7B9I6D3MOoVdDWb3wKTitKjV59XhRKHYS8+lUu/8lx0sdLKud\r\nweDJbxukzBTSSIqKzEg1tnS/SSQcBQe3YiP6pHFyMgb6iaNNBArEgZdILl6/\r\ng/EF0NkErUYce9aVbeP/zWvR0zPTUeF4C2E6nb4bZbtiyNy9WO1hiVot9LrN\r\nToghWke7xr06Bp8aMYlBZeJyzr2IEc5b2ljcXR5z+f9FNz+8/Wsgi+AAmuGR\r\n/GC5UnaMJyMbvuvHF9y/Gvqknk8KHxK4fzkxloWK2+Tkq8QrX1WpgJgMgaef\r\nyAb1T0cCtoOKXd5g+fiAegmWm2bMK9TWAP52urF4V27OEi6BnwMVl//SA2Wg\r\nkgpDafHav+W54rKuVkCTctJhM2KG8oonu5mE6bH0oPBgR1s43TxL1st6r3fL\r\n+rWTs/gWHzyN4m4mrRLJJjKm6hudV3E1dnIs0jFVw7+G/IF5ZO13PDlFE2Uw\r\nwakTsDqLd+6EiQDZsJQhcb2peHBPiNPLqrKU06ScA4W7xQfQ0sq7BJzebEN+\r\nCvpG62nUm0h12r7Ihz7kg+JljOdCgBt5VBEtAheFLRmfULTrQ/vE5RoQ0UQ2\r\nVirroPTL7vP0mHSqEPgrMEzlG9zrjHDxVDlE2GefK6JrfRrDJg3LhYs/W6Uy\r\nbUhfJEdfN6Y89cR8A3W77QiD/ylvdvNOY+s=\r\n=i/et\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-pg_0.15.3-d8f67aa_1674126487052_0.06684238979800483"},"_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-pg","version":"0.16.0-11f7ff3","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | 📖 | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](./src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.0-11f7ff3","_integrity":"sha512-pPeeajXWW/F8kCxlDTjtBomPtlZnW65H9r9uiMI272QSgJtCkaQJOkass7SE9YKPq6SQ/DTCkERna+/qhLiOpA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-pPeeajXWW/F8kCxlDTjtBomPtlZnW65H9r9uiMI272QSgJtCkaQJOkass7SE9YKPq6SQ/DTCkERna+/qhLiOpA==","shasum":"bdac43cac1a5cf1b3a6d6036da2c96c96120168e","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.0-11f7ff3.tgz","fileCount":214,"unpackedSize":307206,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAxOIos5mFgfDvqTrI53VOwPbAJh9Mr6uXGBWX70EfFyAiBAxs9WUTDyJRVKUBLSj6i0vPizZmdHKVBUf4ZHIxacmg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyXCKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqMXg/+NL8vtDgi9Q3O8Cpr+dP0xkIvW3dh7jyc++erB2BXsscnZ7RU\r\nh99bOOmHQK5Cz+SktF4Zy26Jx7p8sYdy4dysKwSXXfWrGhUFPSJudUFVVEzp\r\nn0z31wxGIGKtpP8IWQzmknueKUEUxOzJXHQ0tq6hSbzlMufj9hLdHr4rlYqo\r\nYw9uld/Zp+0FPAGIi8cfVZVz+EzMGjJisx+VyodwANsCMTLY8/J8NxHXsMFU\r\n9rDrNihwEkK1Y0GhN/Vxl6yt/yFWFZwBmN4JAx2d+SAGkfIRRS52z/fm3K22\r\ns986A2LXuZnbJ+LYhe9evJ/csDG167n5Lgo/qRBzn/jPAIOUTCuusVydjO7O\r\ne4z2f9/xAVtUqMcnp3Fh7PtfN4rr/9jemLET3xUPa+yScmg3eomsIHTfQta3\r\n1tK/1X74nnMZrfqBkt8k7sm1FxjLWukdgCCXT07iHlDiMLCjpP7Gs7R/o4I6\r\nnha2g2ApXmdwi4u/dn0NAitybIsYKVBINbG4aa+I+KvPIUyC/BF6kDGi1Rad\r\nTjN2FhOv4L/6MzZCyRn5wmSl0LimJs6rwZ+KUvEpPdlSQCj8KsLx4N+i5eJv\r\nInBapiTGfyLPppLx7HWMz6sHYmmItB9g1iNZHH2rBNx3Ctv7oW6zGe/nhAmG\r\nZmiOXf6KPwa2UcY6rFJzQldWZPo9+5DD6t8=\r\n=x9fA\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-pg_0.16.0-11f7ff3_1674145930674_0.9206640083635853"},"_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-pg","version":"0.16.0-3e17d6e","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | 📖 | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](./src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.0-3e17d6e","_integrity":"sha512-D36/Lh3oy+SyGeYP5wUQ6vfZfREORe7hfyzEXxyc+jkC2N+/JlmzbU9R3BVTx9d26ASwHsV0cThK7Qap8yZG6Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-D36/Lh3oy+SyGeYP5wUQ6vfZfREORe7hfyzEXxyc+jkC2N+/JlmzbU9R3BVTx9d26ASwHsV0cThK7Qap8yZG6Q==","shasum":"6dbedc95b3354692e0b90dda6819e31f0357c588","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.0-3e17d6e.tgz","fileCount":214,"unpackedSize":307206,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDLeFPnMdukeql91/9o5pzuV7qT78kqinDxLj99+Mu1DwIhAO8gaMmFkloVgcB9WbS+gQ1qfQmYpI9Hrik1WuhL7V96"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyZilACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmorow//dtZSofQvTnvvdkpGF1tQBojM1GIpJl0x0IfO8C4c6o/lkbAk\r\nux8iaNjDYTgrs904Fki/o7Vg9mkiBvi5X4ITwMyq/JP7lGBanA51iP8Xe6XT\r\n2PshJfwMs178DrVfEGouiNnnPSYoh6DkJdupxTUgbC3FxMc0r1awLdFDFb8W\r\n+l/bNY5QFiiWRZQLwC/S7WsZxMdkpPV7zGgmfksJoOTv6xEVIKAljnDYL2C2\r\nQsxDSvHvZ3bksjccS2a4bI2LHk9Q3RhsbWqzBaMkwMVwOyZoiFRJjIYscuwA\r\nrSqXkwF71YOloHZjiCZgQ/J3zcMOOFrOy+O8pNaimDcSPoxqTgRX6aU5h5NB\r\nJs5c31xbD4wp2IGEF10fs2IkZJBGiRdmQCtTPx0GNE5mhbMT17N3mfMjyWf3\r\n6upfZfbi5laC/tyGGzxuSlPrKVy4AkJOPo+7ialHuWN0KkSmgSQDl5s7l2wc\r\nJkJg4bgrVb3NPlkwo/NiDjfc2u4FcRumYKmkjfEpbDYSihUX7r4AJMt+Qczg\r\nlsZT7P7TNe4Tju8SDlcr1a023Xw32IajLYOhssXklA3w2G/Yvz9sL5meRJGc\r\ntdGVOh/LGoTNXJX4a4ygW+pdyyjeknQtKycLiukGrGJPXoGB2F+a+rFylHkM\r\nchlRDZjEP/ySJoj/dxk1nX5bQzyZj6qbEKg=\r\n=zU4m\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-pg_0.16.0-3e17d6e_1674156197333_0.6346819610328389"},"_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-pg","version":"0.16.0","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","_id":"drizzle-orm-pg@0.16.0","_integrity":"sha512-LkCvgjvNtt4yFxGjcVPkrfFtHzvAQBk3mf5FkDT0JVuIWodnaJcG390hTli8jTgfuqxsIgu7DtQN6bR88xTA6A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-LkCvgjvNtt4yFxGjcVPkrfFtHzvAQBk3mf5FkDT0JVuIWodnaJcG390hTli8jTgfuqxsIgu7DtQN6bR88xTA6A==","shasum":"d5e60e8ab6b627f88f60c9f8baa425da1b170e79","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.0.tgz","fileCount":214,"unpackedSize":307198,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCp836DlYBCYaUjVrregCAOrtp0+/Ca5uZzdi925SvfMwIgOmIsMDLOYkcWRkryakEenqHLDcnxLVmxnf8ivIgz8yI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyZ81ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5yA/+JBwWg00V/eqjbYYgNklCsJPb8W6hbivgGSvRgXQStvNCj0xz\r\nbWW7FI3nHohPE0cX3ZaMIbfb+S3BO0jvKGe5WoPKAnf5ObJXQ+fVwZ+UQN8A\r\n9G1BhozTbMVfmEtGOS2IdruOvjdKt8BctOJHFqo40Roi45UB1eL5BFzPAkAx\r\nPG4tulwV8TEVLXeCVLk2D+8mdPSmPbOvV8i/GxEmy4GF9l8vWxJrKld6RFli\r\nk1uwg9rus9NiotiulZLNa2TnZPqJ7F82jhnFr4rcBWhd1ilu/7MrPF3JOyWQ\r\ne4wdyVy+uCy798j4S0lXVjtVxvfTd3Br5i5Y3+5Dkl8ES2/n+JeV1J2GIel2\r\nPT5qpGt9bOayQK+4yTsf4FlLvH8OMu68oTWogG+CVC4xnEOxquRFyzaeTfK3\r\nW0brEqD5i6ykw9UltlCHSU4jkRhaTVF7wk9njfWRJQD1xpEIxEKw1UufPcT6\r\niATuZ/ouxRsyIpAyIy+I3+hkcsJlazB82pzR0AkFFeWYmtyV0kuFRdMtTO3J\r\nEcQJW5QXrgVbfJO4ZYCVof6OED/twBfpHndPVeOBM43t1HR1Q7Pe3Cibx8cw\r\nuWQ3u2Hq0Udm5gQxzHBvJdxDYW4Bhy/prrNuQsRcHil1aVA55wzcBjbN66Mj\r\nTfHdmIwnvGkbcnXyq43W4FzBob1qtyCVoXA=\r\n=A8MN\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-pg_0.16.0_1674157876950_0.03209066003246419"},"_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-56d16f9":{"name":"drizzle-orm-pg","version":"0.16.1-56d16f9","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | 📖 | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](./src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.1-56d16f9","_integrity":"sha512-5knaNUgSA8+iGZ3uR2iPAiCXu1gRJZsIpxI/jBVwIu3bDKp0IOpim/sdUNY4FnTLCM4jkpbrHkskqfDGjqggrQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-5knaNUgSA8+iGZ3uR2iPAiCXu1gRJZsIpxI/jBVwIu3bDKp0IOpim/sdUNY4FnTLCM4jkpbrHkskqfDGjqggrQ==","shasum":"d0790ba4fda3150d69ab3dcbc339e5f0a2907821","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.1-56d16f9.tgz","fileCount":218,"unpackedSize":314683,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFcJizE8AL7Dc/aaClDSf34ml1Sg5hhCPNUqXbmsklqkAiEAzTRWpLDm185IyXZeAQryF2qtCorgqgiRG4+SYl8HyKY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyalaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqUug/+PQNs2sSzW42uyERrVazwCQwE4J9p0RMW0fFNsHZTFgr225Wr\r\n56pmTAVRCnfVEFp59UBuhSBeN5ItWk3I7jX/lLhPpxKc7GHul+XwUW+y5/Zf\r\nfxqp1XUypjfmcoANntA9Ns6+6q/A7A5gsD+EZsPeNhFZzIBNb9Ea7c5F6tkO\r\n3B9dcABRjN7ZdikAb4dSMGqNe0/oLLIrYzdnKDEqnaMs8rlz7oVRt7IMiRRN\r\n+7v3Q8pHMecMfhLpuEZQAgaI5Y5oRrYfpW2RoipRY1RksdWyYaa2fIsakxLs\r\nk+5T03INSudHPw/iTU05cCxkTnOv2PhqjvI/5SZKZ16o4gv+0mxlQlXOV3ML\r\nZQTQpFz0dr+Cj8nn6iAE/igkGDYXJ6JelPsgjTK7iZbhmwXboQrB3dFCh1oa\r\nURhNp+Hz4c0ITCWrfnNywd7ogcx4dMWhRXcxYa7p8l5rk70dvjq3Jr6p5VgC\r\np7cRTbXIcwq6ps1cVqC4wT2+e6oIef5eVYcoCS0phwgMVZQJJPEg/zkxZMD/\r\nwOYsvPqk2ens/RnVayGtxNLrIQRAA6oXYeH6sKZKyZE0twFAppdIMJApkt+8\r\n80itw8okh/TIjixVcbmO7tW7BCepuRyZzXwrYoKwWaD34fvNNtug+riTXr0a\r\nuPdohmg/ghOqS3IA6RVZsCjTXF/8JcwTh7k=\r\n=9xDt\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-pg_0.16.1-56d16f9_1674160474311_0.6975296984310011"},"_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-b4b5a09":{"name":"drizzle-orm-pg","version":"0.16.1-b4b5a09","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | 📖 | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](./src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.1-b4b5a09","_integrity":"sha512-jpqqfPws7pIGMIBSNGhtAkRfLFXYsWHonSP/N3KT/azV3r3ifaRQhtgN9s3AYxguuw7roIywThffe6fN8ZYxLg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-jpqqfPws7pIGMIBSNGhtAkRfLFXYsWHonSP/N3KT/azV3r3ifaRQhtgN9s3AYxguuw7roIywThffe6fN8ZYxLg==","shasum":"095cf9d4f204c19e75eff063c060b98e5e6d5c22","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.1-b4b5a09.tgz","fileCount":218,"unpackedSize":314683,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGqk6KdmDcETBd0bfgSEaRTdaBjZgfn4s/rU5fF0NNmuAiEAwY56jmLALYO3mHq99YkO/3zdbMTKfsvFDMDTwflT0Oc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyaq1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpMHQ//fQQW/dZ3kDgcQ2tVlVmosZrBs0NqbNknf9tsDu9PAz7TZP4W\r\ncgKhZwIBliw5Ge+sT6GcI7sN3a5XT0l8pj4HnDDXFAJB/FKv/fNRgHAvnY1W\r\nSnEhk1MqxrXtcdez/+yaJRmV+11ceNCYOPatQzuyLYMBjNSLRZlG+UPaddiq\r\niskIW9qcD7TZ6O+TuVcTKaVwlJOfXgoXljKXz1K9Rmi/d4cDaAODpCqo6c00\r\n57nKXA1FlRpRYY6W30WvxQnpfL51igx44f38LH4i8ifKvlFmzqtNZ8McBKlQ\r\n5fz+iH/WwSaTQLMtu3FTDeQ715dU4WXB1ZMVX6LXMHYBarXww9PMUHjNQ0pX\r\niA1vb16eeMo2JqzVWaXKaOHGyFZRMhDX+op0XAxSqJ+mCpo+p+0u/gee0E8x\r\nxzvRD4P9uZst083oZvgGdg6A4sglPbBGY75oVnXSIPn/XhwKGNVeoWE8HrN7\r\n3PSlxhxXdJ9NQnVo9vwGH+8YwgiozPMhuxOSijbZsrkSSV790BXhkjnE5n52\r\nyn9qnPKL3oe5PlO7C3YBRhLYqeeQclHHp1Gv0gtLZKJOyxfys6vh+RW1RMu4\r\nHQ+Lm8VV5J4koouRFDU/DmH+P35RhsxaryfrtJ9n5SqkybLCQ0GyGwpDNnEZ\r\nH+uisv0A+9KE0gvhsH74VO8/P5Rg4Td95qg=\r\n=UmgS\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-pg_0.16.1-b4b5a09_1674160821697_0.5618412835945359"},"_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-ddf4681":{"name":"drizzle-orm-pg","version":"0.16.1-ddf4681","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | 📖 | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](./src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', 256),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.1-ddf4681","_integrity":"sha512-jXhg9v3+EjB/XuiqW5vRvaTnpudKkm6NrLj96Ccnrglfb5CS1kgHo1c8yQqJPSNZwWbYxYIlOjO4Nso3+ZlXCw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-jXhg9v3+EjB/XuiqW5vRvaTnpudKkm6NrLj96Ccnrglfb5CS1kgHo1c8yQqJPSNZwWbYxYIlOjO4Nso3+ZlXCw==","shasum":"e65455a582b305be6b31740a9ecfefac6ccdca26","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.1-ddf4681.tgz","fileCount":218,"unpackedSize":314683,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGUdMMOEa55Pvyg0BLsEhIyvI3hHbpZ5m+nCdlMWG8tdAiEAlKA0WTnpHGVMO8uVE7c34GbB7QBxpV1BwwA48kH1fBA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjya0TACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpasQ/+Lx1I9pjDfz2k2RqXm9qp4qOHhVWBG1G1Mr2qtdQAmcREUvpU\r\nlvcRSGP7vPfYXxrmFg4E5Ry9mh0x+nJzPPt/gA7R7eB19LPPwXy76wCm0Zbx\r\nhBppK9Pph+PyNctDCGSQ/kKX0cl5iLX5wMr74QEANsccB0K9nRAl/USnk32J\r\n7UdY5vXq8b4YhuEUuSnKMqvPy3JpBvcSyGU7lypvHuwVbGEYhBW7tU+PsdeP\r\nDeDyr1cWIWFNNMyaijGkFHr/+UNUOeuGh7IZY96dhDAvyXn6petj5mF+/Oyl\r\nYdkQx/c2QtTB1/gAY5JvsOIl6mInGOlwqmonP+h5j1uRs9fZOpvbGVhkgkG4\r\nQJKB3AmauIdtA3D07utMlpauzjJhkXZtd8MXIEDuqBVqAAR443H6b9g4RhtJ\r\n+MaXkleg4+ppU0XKvieeJN1ek10fzmaVYnyaczhg+gSh4Pw8G0H1fQJUQKbb\r\nu2EGe5PsXDzQYgdeEHrfxPhnI9ADBHWhqgFGRHlTMb4+XndubPlEqbG+qXfU\r\ncpzWmGmIatZtn/SUlYExSZJt+RPkzVmiC2C7EvRHn7g34KVmOo4QFanaDlWA\r\nfiasYqCjzD6bCsMGs41FqBQ7IF4JNXG06P6rLZbo4ZLTyyph1AHDvbjDAOyk\r\ngtxq9nwaUOG7JxVOI+wS32cS2aWdH2Ll4F4=\r\n=qGyn\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-pg_0.16.1-ddf4681_1674161427609_0.023966993061242947"},"_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-pg","version":"0.16.0-484a8ae","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | 📖 | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](./src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.0-484a8ae","_integrity":"sha512-kTYJsY9PwOoTNfTfkRfV4fSdj5UVI5akqUtXfgahjumTxTXosrNOEhDayjmtalxKECeghixruNynIHqAazVkfw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-kTYJsY9PwOoTNfTfkRfV4fSdj5UVI5akqUtXfgahjumTxTXosrNOEhDayjmtalxKECeghixruNynIHqAazVkfw==","shasum":"09c349a40660836f1345ea6f419e40efb9a475d3","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.0-484a8ae.tgz","fileCount":214,"unpackedSize":307230,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCciUn7FZxq8dacSQrPEsWH1/vac74d0+2wintaNH1hHwIgQoUiwfDCly6/GNwUQ/EpcLeK9eCjbo0UBE7jypuWKcI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjykg8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrAeQ//dNu3jVgWBofyfKclg35TiqugDMguqwyTO0Xrq+owCxNlnXgw\r\nJCJTCGcbo7AFN92AETVNqewTv0GXeIa0jxjVP7pvTZQmt+7jW2Q9wOPvF+Zu\r\nIlO7XSl4EumZ9GSK+TrkIauPvMV6YFUXH71cvSisjSFq99cPk2nmUlW6OIn4\r\nZqSwzFB54IZAHoVQkZX/0/mxREkQhLPlNMtsUi+tdmBCtjujb0rp1JslZdc5\r\nrXRfgzmJpxt/gId0VOIaDiog2M7Jz4bprDsQKiWCSAGJD2rH+f31fs/jWhrV\r\nLKOjN6tZ3jSdQALDX5Pa4H3I4IFCLYaLqJFqbkGhjLjMiqDXF12jEPoGzKiJ\r\nRJQHonSEy4Se8gX0ZLT2vo+W1vAgpwPyicD1B3KAinxPs+z7OHHdg4MsY4ku\r\nCGAfO6csbaQ7jbDlzjjsbjkhOkM5k84V1nqxH81QIMd1vqf1HdFAqQ+ii0pC\r\nXKMmF0TLYz0lRLJBOTMPcl64DXA1G4G1g88woveLB/j+mpozlxRasRIvq5rl\r\nfFnKv2Er2B5LWDGoDjOvU4i0YFVgBowBZWproX5qFxxgX68c8hu90pmVZEwk\r\nGQHx0X/fiC6pgZN+8w62zt9R2IUStD74fWR5zk20G6Ut0CkAI8i/hBnmuYsf\r\nOUV8pmMT1BoJm8Pj/0AXDh5tYkCmTXhpCRI=\r\n=2L75\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-pg_0.16.0-484a8ae_1674201148120_0.26966677596581357"},"_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-pg","version":"0.16.0-af45b90","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](./src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.0-af45b90","_integrity":"sha512-VThcRzOtdXDzNWffG5qgNYDb2W6B3y1c0L1G3gtF5SKz2Q401ezq0AWHwA2O6pLKnNMxd08lng5asZnPnviKUw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-VThcRzOtdXDzNWffG5qgNYDb2W6B3y1c0L1G3gtF5SKz2Q401ezq0AWHwA2O6pLKnNMxd08lng5asZnPnviKUw==","shasum":"96b9feac4edc6caf475fad8df47d00b7bfbc0996","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.0-af45b90.tgz","fileCount":214,"unpackedSize":307225,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDbtikRXjY9/CH29Q2ZthghiHL92ehia0VgyoF2q/UKewIgGp+mXmz2KYJCPpyogdnZ7rxI5a7I833rVnZf11i1VQc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypUTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq8UQ/+Nf+DMv0zmhMV8X5bEmHjIK5JEL7AzqJ4175r9siN4FZ4Mmrv\r\n2Y5YLQ3xCdLZB7kWCdQp04SiBuiPUatpdEhAWuY9Vb5ESVNeYynwyh6aQNX/\r\nDsp62+qKz0X7a7SYL4uht4GGPH3g5cBX7+ImNveNxmt9m1OPS2otzNtlgaJa\r\nu8V+ekgpGa2C0LCanN+KhKQvFZqJQZXevtKCkCQFSd5GlctrxoKHm4nkxBgf\r\nk2JQRuCMSFC2FhgvEpzIJpth746ceirxQjl/N5UgneziHGEeraAE5kiTiHy7\r\nYUvIvSWi7OI37JBBSKpft4RPvuG7uI+bTKqO6TrJZPMobQX6lcukMpw7vmu4\r\nE509t3M+40IEgxumWaZhNzZnvw4etkUqwJxoshAsmyXyFz00hxD9eoR8Mig6\r\n03nZW6mMivQuXI06poPAUENRG1JL5C9rj5wFQhVPFEh8ZHmmihvaiDxmB/mH\r\nog2B6PtNfmPzJ4TsXsr/+jTp7dxT8Cce95Y4Ni9oHYsztXQBnMpIHN6YA7PK\r\nYwFpQtpsQU4G/FG6Suw/rJOtCk0VxqOqRLybVEj4/Vgn+7PpMKRPTOhKLqjT\r\nNcF/ZkWW+JhkKZ4SmBuLkZQyRQ6wBC2n4G75vZIeSJsZX5mPaiqiWGoHM72w\r\nqREhkFvuay19lpysbPKeXGnHrOqHR+XmcHs=\r\n=zsNB\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-pg_0.16.0-af45b90_1674220818964_0.9994123197744971"},"_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-b9e9ba0":{"name":"drizzle-orm-pg","version":"0.16.1-b9e9ba0","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](/drizzle-orm-pg/src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.1-b9e9ba0","_integrity":"sha512-k9XEvJsMecLTPKTRLHc3gDSDHMl2iw9Aw3JvR+fFD86Icc8mzEPyBcTE3P7/G3wZJaIpanCb/zaa5s5CfELcOg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-k9XEvJsMecLTPKTRLHc3gDSDHMl2iw9Aw3JvR+fFD86Icc8mzEPyBcTE3P7/G3wZJaIpanCb/zaa5s5CfELcOg==","shasum":"cfb57caac444235a72aecf2281f3f2d32d3f239d","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.1-b9e9ba0.tgz","fileCount":214,"unpackedSize":307239,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIATWPeBdDj7KKPUAXFfBCceiwmswfhSI8w/c0/5V99nyAiB6hWBU8xC4CWuNbrZoppWazZDxm1Wqp0jPbXiy7OPYEA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypmVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmouThAAmMAv7KNn7h0zNZgdtZaMjP0vbwB2yoDiMSoJ8JcJCJXF/sCD\r\nMc7C0P3cpg39PPIhjhuSr1Is9Ow4NvNHD1gPagdD7JqBpeHgHnYf9X3kBOKe\r\nB5uZGXjQGRqG0CKNYOqRDr0INrjjZWw9OvdchPfOB2mqVIw20sVGXc7k0U0h\r\n+9S2WoBTKdH+KiK3BMybZ2kA56j1wRA4x2NZBB/TR2kxqVl+ynNgyw9CjsVq\r\nDYJKHm6LMb40X29ytlDQt2Crf/nBU1wUUMQP1WdjN5kh4j05zISfLZCAq0uy\r\nwl26MM/eFA0TlxwdKCc0Uk5CKcedkClWi51RTYTbepGzUbs8QZHvBj8I1HXi\r\n89wa5ud8yONPWvPLQ1QT5+He3ZUwTd2SGPX4v+M2jkODIaJDrMfum5cOMi3E\r\n88pPEW7pTBiE1CaV08LGZ928Yq+NOTDGHC45sK/I1SxgBzRBDz2ih5GXEf96\r\nIPiWVgfqiR2bImhYigQ8bdk/UQGLrJ01CiN/WqpX6BH94/OLVV6yb9bzRk+S\r\nFqVuNZ9PfEiCYD+40ZwCiBvZXV5/0Q61jBj6ZUhWWT08P5r57wbsYCk7yd3W\r\neyOvu9GCTUhVmODV+fxuquE8+RAPQSh3wP1D5q8rHdBsO9eT3fRAarIRkCz0\r\nuaNt3oQ9jHeVGLsz8t1FOTHnVgmuT0Ey6rM=\r\n=yPLh\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-pg_0.16.1-b9e9ba0_1674221973212_0.012057547313256478"},"_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-4124cf0":{"name":"drizzle-orm-pg","version":"0.16.1-4124cf0","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](/drizzle-orm-pg/src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.1-4124cf0","_integrity":"sha512-i3wLmWX9z/AuZnRuy1lGTmoaBtm8DF7IPDrLs+ilJQH6QF/abx2K+iL/ZjHpZusM/SPA/4/GMnlk4VscH1Ahzw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-i3wLmWX9z/AuZnRuy1lGTmoaBtm8DF7IPDrLs+ilJQH6QF/abx2K+iL/ZjHpZusM/SPA/4/GMnlk4VscH1Ahzw==","shasum":"cee1d3f19132b7dff8d695527ff21f484cc5f6d0","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.1-4124cf0.tgz","fileCount":214,"unpackedSize":307239,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFG7frq9iekXA7TkCYVtI+Wz7zQYY/ooPa5Y8sU42HG5AiEAlqX5Xciqhtw2mzvPrWjdVDZujHUNLu7yxRD13VhOK7s="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypu4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5vw/8C1YJdHdshA0NLrQvVdBuvUGkBjwT0qfF/t9GbBNXzfjNS0Q7\r\nrv3GzIEpHPRQV19Guc/dVNH3vxMrNP9LManQ8zleqDBQ+K0yg9M34jbRG1MR\r\nOlSt2IleN/F5gzwPLHpK3+x5W/qVKIiuITqCAvz3DlhwNzGf42w9pR7POx4e\r\nXA0ps4xwZ4Rwj09dkgxJJyd1+koDX5zsKkUU+PQGfLQojmxXaj0Xfw9humBB\r\njw0mGjxo84zKUf4A3w8nWci9HBMhtrsoVXGeB0Lg6MxWUy1U5zucAEISWZWz\r\nIVfNGh65IHbe6RDj4ZSlxw6VOYbhi1OuF3Ac16RXb+S4tqT1yH+ohu+aNgP3\r\n6amnRBKQlMfTPVGTsUjz0wRcOxQnirinI1tK1/FnaNC76Ywzk3KgCj44ZkD3\r\nehFz1ZbVSZCYgXb1PYSMTT+toIY38OP989wFo96AcoZpa6mXJFgP0Lh3UxPI\r\nYFIAHoDsgMX17UzSylvdckWhe3wsq/3jSLEqpgFx1+JPt97whaKCq8PUbFdv\r\nKT2ayH8p4G4frk1y+g83s97q5dyzMsBysLHWm6G1ASHEJLRECF+UAjD47gxC\r\nvFwg6SRpgKFM8k9alc0Knm1rgGq/8SbosUfqxFjhSwCEFsIA/XCAvDq+PddW\r\n3+rCmQSULFTln5S7Ug1nlNVHyADHEo3azpM=\r\n=1of2\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-pg_0.16.1-4124cf0_1674222520012_0.8122570744060911"},"_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-51c77ba":{"name":"drizzle-orm-pg","version":"0.16.1-51c77ba","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](/drizzle-orm-pg/src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.1-51c77ba","_integrity":"sha512-JVxk8gLHBf6E7zkohUxAuUpRB6Qqr0DjBwOr/B3y9Y6dQAYhCQuCVE60ftKrTXbl+DtTpt6wvlG6yib6+wJ2bw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-JVxk8gLHBf6E7zkohUxAuUpRB6Qqr0DjBwOr/B3y9Y6dQAYhCQuCVE60ftKrTXbl+DtTpt6wvlG6yib6+wJ2bw==","shasum":"681f70847337db478ebe9de51105628f490e20eb","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.1-51c77ba.tgz","fileCount":214,"unpackedSize":307239,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA3+2sB/sEkoH5WerpI3EIVXAQ4KcPvTtoMHgQU0PdknAiBVWtyEEZFxfpza68fu6J/vP8u9TiRsPbPI4WaQRZFPlg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypw+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqMEw//fASzpcwaoQ0ZFg3UUY0yPhBMBDD5gaZUNoLN+UxZo6ZIS0Ow\r\nV1qkNsqUoPY4aP2Tn3EqkYkEBrJ3iDSiCnH+71yJiP5KniOX1ChzKOS/afVJ\r\n52zJ+d9leXZMlYIsflwKXvHqhNlbG6ShI9Qz7vMGnKqJI8QGioP3wIR6+bXp\r\njgNUeasyNLBJhZNsWMBisrteF0jHxglqURTYNCHNR5Zjp5IO87AcVwYgro1+\r\nArXux2+w3rTjAMdxc4yISiv4WxGjpu0rfPipWn3mdeCf5913MaebrB5eZmKt\r\n+J233vAHTb6gXMGstlWnQDFucX3ijeb5mlxyMPq85/vnfMMLFex7uyWrpOXd\r\nMVaFPA7CVgQRzjJd1G9bQREcHIb2XcU2+iTOOhup6aVJb47e2QRsqL0ezFkF\r\nj5vOCEspkks0F0IRmTHHpkwrD//1gJ7K0khq5DTUNF3DbVab2H7E0603AYQ1\r\njvJNynRLM1Rews6jsaS0IQ5AY13pQcvQC5cg3vv1zdsCY03/usSs+9R8c+Uo\r\ndW+I9whFKAiYJI/T3CXagTrSg5Bc956DN99ZgIDoBGtGV1Ov9v8ETSsS9mNx\r\n3Al1QORBRfbjUFjjRNH77nAIgn7nMsbtMtSN6Wa+mt40+ZLmFZ882EvRTe8f\r\n/HH13P/pSXynGm2hTER1S/06rVh7dSMtg48=\r\n=sHME\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-pg_0.16.1-51c77ba_1674222654270_0.10894847812308806"},"_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-pg","version":"0.16.1","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","_id":"drizzle-orm-pg@0.16.1","_integrity":"sha512-xN4M4MC9NBnOHWzdwo2fAOs94VzGVvqjF18IGAe3RC+KMfde9TVF6KPT7WZgJR3p+eZoKKFiMOzkeRmoEfCyHw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-xN4M4MC9NBnOHWzdwo2fAOs94VzGVvqjF18IGAe3RC+KMfde9TVF6KPT7WZgJR3p+eZoKKFiMOzkeRmoEfCyHw==","shasum":"0196d09103e78082ec5f97ff9c335811463f3efe","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.1.tgz","fileCount":214,"unpackedSize":307231,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGtuuWSA6OXcL9R/MrClL7rU22NaxfCizEAJ7rGSkVSgIhAJvkSBKbcwj/emnNUXZFLWxM5YpWIoqExMZGGnx/4MPw"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyp35ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqbJA//Y010bki5+OUhQtsvHQkYPs6jrddUbTJoELz0fv4mTrDRZjKM\r\n4QX7GLnEeDz0BB6VLSmQnqj6NLlAqw7P1PrgtBEgt0bJn+ghLDZ8hQR5JGWA\r\nyod3cllY5NuoSOvXeZNFZce2oh8PbtSPQluzsTiYk/OX9C8K9CjrMW3ty7PP\r\nwASdgaumnYNabuOD+s44GMnA0nh6+ln9NSBd7FGqehRI0cgN9KeHlxvgS+EL\r\n+gzAVDxhUKRdIm3QsiimM4vOcJ16fznpMGvAXPU2w2WBifjzZFO823Cr6M+D\r\n7m0F8YTCF3sXrcM1jVc+C1JdwAosVHrQnbJFOCGcsTsOeMBTSdra74vNtsUP\r\nFDuvYdUE98b59SKGcPPFJ/brEhCyxhfJVUaHQX3o6pz2fmvFRSnYhhQYDhDJ\r\n7xSR2QP/Z55YFXUh6ogFttUg5wWvu9GOAE12MopxUb3Te5cR6HwNVtMC36ee\r\ngKWIzyKO+nSV1x/7tebblH+Q3H4edoZCid+4w0GIzBOFeL0N7XpcvzS6IT9y\r\nmAmRk6iu+AtNnLO6tEksWXhUMbXFvtt3JPDwXFXL/Fz1sP3xxkqtWwKqf7sH\r\nvhlcqm6Y2HPs9H+bBkd+FpSR1X675pR8U6SEQksEmGVMIgZBSnf9Z8qqbZuc\r\nLgp/HH0sSMaTUtvM0xkr4c1KfG9KUmF4rVk=\r\n=ohfR\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-pg_0.16.1_1674223096791_0.47435775523542345"},"_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.2-cf5a510":{"name":"drizzle-orm-pg","version":"0.16.2-cf5a510","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](/drizzle-orm-pg/src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.2-cf5a510","_integrity":"sha512-A9/sYiVCpkM7IrbahUlkrGS8UMmMRGYpnyWOxQLeq6Ll9jdftBRi72MrzhG/Q25cRv4XhCN8TrRWraiIB2PleQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-A9/sYiVCpkM7IrbahUlkrGS8UMmMRGYpnyWOxQLeq6Ll9jdftBRi72MrzhG/Q25cRv4XhCN8TrRWraiIB2PleQ==","shasum":"c75e28d7a30754a9532170b5b95ea91156385a32","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.2-cf5a510.tgz","fileCount":218,"unpackedSize":314716,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICgynXmYGr0DMVLTXoLC7PZQe2W/hkekPQaBNmWQ0+bxAiBaA27CPUwlx0noIEmu0bKLkmrBPcOu9Fvgopno+X3ZMw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyqmMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpOog//Wr6JwzFvRzqywIOC0VcrcOQspDjAO19ADpEdVgXKQMTXCQPq\r\n+VFW0KnhBTDnPV4eOPANo+NeOCXL4jgUbciODFEA9Y6vTAXW3Wj3JXTBQGvk\r\n7zADIF1pLbY/aNDgZwYGPeRDTuRwqzv5lILI75hkarbWsGacUZkrxXEqBgc0\r\nBIOBYFH19bCPpWe0rK+tzLo/jrXv2VKu6CTveuOi8Av9s/SzWAsfX10De3Jj\r\n2jMz7zQUIy7b7E4SCHiUOc/m4G2HrK52DRExNijZ9sWy3OIKzaserECh+cgD\r\noPqD6seCZN4zmA4HlYiwlf30lpL+tTZXArqfrQ+8oAjLd3IBQhwhqgPCMl5Y\r\ncY1edsOkTM9yk36L0xHiJ94/GFLExvPBSHssTHBohHlmiL0n0TBda9ZF8+I2\r\nWiCUf1Nb7Wvx9mV35QsjoHf7bKKEEf7XYl8kpbCrzTezSdblA/oCsBTK1sIY\r\nUXJwu4sZ5Fd8PPnsLjAC9UUNHWfRZA+E7FUjtZ9OdwNWgXgtUVrF9//CrSEa\r\n5DW57lt5mHOXrp/yzYVGn6IBrnxmKVnW87pC0gbcgvBtr8aQTGrBi+XjpJFA\r\ni2ko40RfU6xENufxPZmpiFt3z2E4SUnjn0Qz9hCBjdBiOq+NdQgtPb4XAI04\r\njqZ2H2CH+ssCYak2YU0JsCj5vKgKDhkCCUI=\r\n=zeSm\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-pg_0.16.2-cf5a510_1674226060724_0.36471803316174367"},"_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.2":{"name":"drizzle-orm-pg","version":"0.16.2","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","_id":"drizzle-orm-pg@0.16.2","_integrity":"sha512-/rhyrCZyvS+dyXPRh2hMR4giAnQGDeUAlKM5sThgzQz3i9Qml9YLuWJ6Gn63eS4LAtTuoLvHCIJBmnSJr5xbZQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-/rhyrCZyvS+dyXPRh2hMR4giAnQGDeUAlKM5sThgzQz3i9Qml9YLuWJ6Gn63eS4LAtTuoLvHCIJBmnSJr5xbZQ==","shasum":"7f8a3efc3df5e43eb84be4cf9460d09d672bfa0b","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.2.tgz","fileCount":218,"unpackedSize":314708,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC+ybDToAikaYk+CSbd71Ln2YZe8zWOvz8BItw81nEMuAiEAiKrTuK33v5cseapRudAbakHyQEHDnGuZVhvnE2a8uJQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyqt6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoNdQ//Q3/mHelMNFU2z6a4Wj9HdLtOYVFY/xQCCEsy8UaTh6ICnGec\r\ndbdGW6G1SbXuYIa9k7+CH/2UKS1e5Ej1ml0beEaN3svwMFbL/o/6RrOYSEm6\r\nWvenpc+VeGrYaptyfEHWxEEo/caOAgcsM8z5bcPerXoz5YPvgYG9Hu5JOBWE\r\n3656yuhofLxKb19/+4kiigX3KC3CYRY/8LD2bSG0UPFuN+5YDz9ND09xIRtB\r\nYzc4l2zgNdxNrUMjv6inOYYdCvS8KQtmDeI+OT8++bAFPm7rx05nqaKtZr2r\r\npDkxTw47vHg5eAuTfm0ig+ZXBpsGsEyq9MWxPWiZjoP+QcPjtCXCul3PO2Qj\r\njDjivs0Bs269sdggyWzi+KFJQ4HF/amYkZSz0vJTL7Ft1ze/Skvhlf0ZJvWz\r\nIyYKkzN3+Ojdkr+q1yVEZTcF7RMyJ32bmrxkwnUuMGOmiLsAOInHGr94vh7X\r\npb8dSibh8bpHU+znA31Yu6T3YUacSkOWUccH1M80nVfUyP3bkOC0gg2hTJ/F\r\nQI/RLfjInEHK8Q5uy6emyCkMHPCuqYvN3cMcFbilQqfM74NROvsSqcbwGzG2\r\nTAhe6Mb2/XbmVkM4ACeq0SOIm173aJoTADL014ZQosCswsPCgKJCk8MGJj21\r\nA8NGYi32t95eE8cYpR5rP+MN6+LKyjA2vKs=\r\n=rvNK\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-pg_0.16.2_1674226554297_0.49228584164509903"},"_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.2-c522f26":{"name":"drizzle-orm-pg","version":"0.16.2-c522f26","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](/drizzle-orm-pg/src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\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.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.2-c522f26","_integrity":"sha512-uY0uZRRg8zR5/em27YODH64Tmu4RCMiNv8Drx9CgC96yDdoJNBEmAx+tUuobGrfCNatwGMjSXQ69X+szzYj+2A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-uY0uZRRg8zR5/em27YODH64Tmu4RCMiNv8Drx9CgC96yDdoJNBEmAx+tUuobGrfCNatwGMjSXQ69X+szzYj+2A==","shasum":"37bd9696ceb64bcfc16e06bf5b8bddb4ff99f0a6","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.2-c522f26.tgz","fileCount":218,"unpackedSize":314716,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDEWGwfe5vs1m1b3D2+wXWrNkw5awytX9RSCdmtvO2DLQIgV0dc0isLRg0sjnuxPQWx7istiERpRrBHYMMtXjooo+4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyq04ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq+RRAAohbRE6oaSMgNMXduXey3zYh1giLeKJ0JC5HOa72jw8L6LYLO\r\nIU5F1eSmI+G5hK7pGdbcOxzYa1wp5Y7Je/AzdKIUWWv5NgnvKMs2y/U7FS1D\r\nhtXqxqGF/PndPlHjh/XYlsl5HiufWQ9XqKKmrupzhaSE1a3Iij2uJwDcf5rq\r\n9yVr62jr1JMFCAdZKcLrcI9ZPxA5qMAkrte+++r1WuU1ZzdfR08/IuNha3lF\r\n0HTuRlRSnDsd1/fhPkCYI+pKBqbvjudFe6GIeD/qABgmJy6WNM1MvXJax7W6\r\nsXK1o6bMmek7rhcwe6Ocl4KxzYmLaGA2EQz0VtGYZyK0EkCQs5TqEz/bV+Qw\r\nnQX9Po4Y9QXkgkIaPLLr3kCDcnsjdELuZd/+kOJir5W70svpOBbDWWmfS4VG\r\n+8BcwgOaaT/q5PuDaHz6rXRbJhNs7gexhT+fa0MNXLshRs8SbGR48w8Aur1E\r\nEiWrNw7Hp8yMDiTFPIujJ3KNfshmYzdWZLNr/R8CvTq5d6e083qxsSMz1+LF\r\n0VGmnTeN8Wbim7pGtFoZXnlI5vfcrBv5FZXHjJKFp23h7jVgs4P0uur8hpNm\r\nWv9dV0qxsyXz/j7YvapBNbww4yljz8wH9A2lBHJpM9USM9D3ndsSeppKv+nw\r\n9jERX+SQauY2Hp6NoK9CUk0WF5MOzPf0Mo4=\r\n=W5Hi\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-pg_0.16.2-c522f26_1674227000571_0.8654978518363814"},"_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.2-97f9977":{"name":"drizzle-orm-pg","version":"0.16.2-97f9977","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](/drizzle-orm-pg/src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\nIn Drizzle ORM, you declare SQL schema with TypeScript. You can either have a single `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.2-97f9977","_integrity":"sha512-WRzM0uv61jMzb+InA8uBFd4AJmP7qQsOUmRqNJBamy1D7G8V3HmhEkueCup4DkdbIO75im1kYx4PGQnyU/1TAg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-WRzM0uv61jMzb+InA8uBFd4AJmP7qQsOUmRqNJBamy1D7G8V3HmhEkueCup4DkdbIO75im1kYx4PGQnyU/1TAg==","shasum":"edccd57fa061bfcec2919260f3b17dbe50e35e16","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.2-97f9977.tgz","fileCount":218,"unpackedSize":314720,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFJUg3RPQbstR2Iji4WtTEhjLP7TihpVhNY0kcor7tVnAiBMFJp5YHImTeac+xvgrs7ke3FC9/ymfYwwOv089jLdPw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjy8mHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp7DhAAm96YC1+d8WalmRra7ENtA601GTVAv8ruZqJqnCDujsWvPUUT\r\nVKdDUoq6By/AvPm2csBGAWxmKoSA3R2MgdFWt+BEN74v2FA5pSlq+zMGBM4z\r\nPejrRFstbMsCLFkoa/jAW3ptia4Z+7TVKTu5pAVhxPLedUuFuMUvgwMCzJ6B\r\n5BKvs0NyQR/sjwNSAqU/IcrlVpmzD9nSP/FQOxFvCT1UUQ445Xm8CMF5+sLL\r\n5vXNsBG/w5nuyDmZo1gBLl6dPaQbwWG8RiGcWMPZO9pwibQddM4dTZ3gSGT5\r\nN8C4nX2b/bskS1d9MbPkpd4fJS9ZBOChqA/SHHPqRnp94YsyqyqHuEIFl1Oi\r\nJUc//IjUeh2Kk49XBL7f23cBysw/n/4TrpU1Y4728nrEuA94Jd1C6Hp7IZ7Y\r\nSkkKCcaLEsj+Br1RE/eRsDqu74AdBlCd+6sXT/BT2NJkX3IAPZPMU21CZbUy\r\niwMuDtdbJI22+j/Q796uz3Xi0S2YRf1gGCXrUEFnrihMAjgrGzv7YXbv0KZf\r\nKuuE9tCAptneNxz4TceYtN/UnavIF/BaHy6+mVnw2gG71klV3MNR9jeZFTHb\r\nkrYMVthxzdw91ERHfnRuOyP8uYgG1m4xp/eW9kRxdIAZXpW3QfDekL/PRlJj\r\npaG3Ykm19F0kfhsL1rWKtjk41eO8xxG2nwk=\r\n=u7yI\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-pg_0.16.2-97f9977_1674299783385_0.46614163004760756"},"_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.2-43776eb":{"name":"drizzle-orm-pg","version":"0.16.2-43776eb","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.15 <0.16","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](/drizzle-orm-pg/src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\nIn Drizzle ORM, you declare SQL schema with TypeScript. You can either have a single `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.2-43776eb","_integrity":"sha512-LOM6/F80fzpyHyw4gVOjDEvjm0XFpJ3Ui6JHDqvL0LObZRhq3/6cjofpSsWe43d+sxFPO6uy5w3mUZxiKim2hQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-LOM6/F80fzpyHyw4gVOjDEvjm0XFpJ3Ui6JHDqvL0LObZRhq3/6cjofpSsWe43d+sxFPO6uy5w3mUZxiKim2hQ==","shasum":"298132d4ee38186e4f51d794692c17627792a6bc","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.2-43776eb.tgz","fileCount":218,"unpackedSize":314720,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHbBiRcmUV3lx71LkuvxBX+VSC40BiC8NWotZaGl7elVAiEAjFoAQ6WdAjPPof5eAAJKfCS8VQIsdPJBnKULrlgOo2Y="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzTq2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmox2A//a2ScccQi9gxxPkVQ6bFIESxUozq/xLo6xC3vyQdg3EWQJpyg\r\n9amQDJIZvJUIwOLThGK7OZ3OOs+YGYVMGSuhZ/+8frJ9R9B+Tzv9zHRKwuVb\r\nSs/3oGDiimsTaMcpp9/ATCzd5f9Rt4ORWKNCc8FFCll+Ui3rIxLZ/2gR1bZm\r\nNolwUe3URnZ+0P5dwlrE1AIgIVYeRf3n+cpnlFX7So3VF34/apA7D9/GR71w\r\nOwhaOsODJO6BgJqbitZ6K+DOXulEQEyfufmzl0PwtIx7uVW3dh0iYNxYsPWN\r\nRG3tcTKPbKDKVSMZki1ammxD6cqcT9NHRUZlDkgy9RtEPAQqHzRK9HSbM8cd\r\nP26KjPYnPqq3QLoYRXZudR3K9bmfYwjvSVyL2mtjW+livQRTe8Sb2cZRTPU6\r\n3iuUG2CA6laQPh5yTmaZvQ45BjZDIwjMRQfQgDV4ukIdRqbmqpdFv+ssOsYQ\r\nIZltYU7Zssv+qjUnHYUhWOYfe8eEFM9jv7V+p8GSZKC4t3y2ZbPgYT1J9dJ2\r\n50t4wX+FDRh66FLzFh7cuCPF7+Y8DhIhQ1fT4WTHwZdvZJHr2tTYI3lleftU\r\nr8wVaCEPvWh0panAMnVgSL8MNb7OIDJN6UbZlDjvkljH5HmcPSlLwKzYkHlN\r\n/Cmc+TTMZeKhmVWxU0Vcp4yRRt/CW2e5Ro8=\r\n=xFm8\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-pg_0.16.2-43776eb_1674394294073_0.6066487029255192"},"_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.2-2c4c5b1":{"name":"drizzle-orm-pg","version":"0.16.2-2c4c5b1","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.16 <0.17","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](/drizzle-orm-pg/src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\nIn Drizzle ORM, you declare SQL schema with TypeScript. You can either have a single `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.2-2c4c5b1","_integrity":"sha512-Ct3E8PA8tre5AtFs7z5aWfxtRhB5iQDeoZtWocbKczxb0MJ3fteh22GGmr427HTtBAv/SXdFDw7BAG5suLmEZw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Ct3E8PA8tre5AtFs7z5aWfxtRhB5iQDeoZtWocbKczxb0MJ3fteh22GGmr427HTtBAv/SXdFDw7BAG5suLmEZw==","shasum":"4d20e36498e1c3936111750d32f967c16b8ca74b","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.2-2c4c5b1.tgz","fileCount":218,"unpackedSize":314720,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDq/HuE2YBjSHzAHHf9GJS67Cd1XiVrK8iszc6QKtBm5QIhALfKdomL0wbHCFKWNAvm2t4B8kZPv2aIRCs9CODBq2Uu"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjz4R1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqguxAAomb5VVGtOvq5GsVBzIrIgmT1vhCfWrjf4Aaq2bAOvF1hK5xk\r\nuiyqYI0FNRz8fsAqskZuxjR/j9VzwiVw73eN8bxtkNJidiyvFh/8qNoxWWWT\r\nivioVgij5cyg5pwNvGtMz2YHq7asP4dlpC5GwO/kt5I5WqBAsr5VqmdzMo0j\r\nIbuc1mp0JoZsQpQgazUrVfYK+sgJON5gom1FZnCzJO17ggZt7HIwkcecOOrz\r\noIXXA7e2lSFJxGtex/uxlf1QqFhWLl2ZbqPoxsIBwT2mAQL4bfKqvcH8iBEt\r\njI5oGkUWEtIGxzaDIg1wV/7Em/xEOGtqPeRqjVMaA1OAcc3fgb3r/tNPkZGM\r\nQqSrhjG4WwD6aFtBcWhBzVa8A0ScYJOMg4TW2J9Woab7KAucSJ68RWhqwDrf\r\nQNPMyuouGQJA1QYUPy8q2IzJPyacK3JEdaMR/m7bMZk397VfJP0tUq9T/JfD\r\nkngFyi9mgliXkwxKV/nb7UKRxO5U39Y1tW04PLRU8Uewi9V/28t5n6VwshZx\r\nYMdzLgK3eJNbsRFyu0kn6YDZZJKzxI9SxGRciJtElEPx7i6jRDiAdlRwQ7u2\r\nV4buUNOCymptFl7wo/ELBLf6ir+Xg/H+BYJHj5PvWoga6DJ84+OCO3sxTQNI\r\ngmabdQweqZr+6Sf/cDOg2q44XVY1FmyACFI=\r\n=qmNZ\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-pg_0.16.2-2c4c5b1_1674544244957_0.7990636676589802"},"_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.3-60d4ce6":{"name":"drizzle-orm-pg","version":"0.16.3-60d4ce6","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.16 <0.17","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](/drizzle-orm-pg/src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\nIn Drizzle ORM, you declare SQL schema with TypeScript. You can either have a single `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.3-60d4ce6","_integrity":"sha512-/5akuRcpfKDKw3VPBBCFVMeEv35m5j6WbuwNNJcdvA9722R9Kd20Ry46P5kECCwxrwiHvGievTeGRHOK4wwnSw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-/5akuRcpfKDKw3VPBBCFVMeEv35m5j6WbuwNNJcdvA9722R9Kd20Ry46P5kECCwxrwiHvGievTeGRHOK4wwnSw==","shasum":"076525fe53f8025492cca92bbcb61f0082c4b018","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.3-60d4ce6.tgz","fileCount":218,"unpackedSize":314720,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAaKlJ+hF8qS9V1tHY6QAjxDmxrv9XcjJt0IbTtQ4mcDAiBKRelUR00Soxzq6K3gu/TdfwKps03vYBp2ODkdnqmLGA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjz4ZyACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqA7RAAowS55g9fG/RjpeET91tqPRA5tbsvC0sZMuLXYeuWZwQ4Py66\r\nT/Z5thEMpUnx955/tzn0/PGaeaxt35pX+XoEjgluIHpb1EmA+O8rOzDdujoZ\r\nluCrwIOdk4jSw1Gl66uhtLZj/zRAAmIx2aPOJz+nOpshsPA/T5jUt0PKlNg5\r\n3aBeU3rcUDdChNkcxVsnfZRZyp91NDnu+Y0tbbk+9ClziZcFMmO/NSz6BROz\r\nqNdg0pumi4StwuOy5i0CHF2ZjFJmUXvZct4gsO3Gk0WxTySLzrgUKth3v4+Z\r\n33W3Lmb3cZZvHMJdD0IDwtzAH9uHASSN6U4Byqitoh4CRadArSsopHYyoizf\r\n2Aav3bOQLsJyK9mv5kH1hcQidMjJfCD9L9gQOebaiGA4oN9ZW9eTt+QY2zVk\r\nLCfgojtoVvgFbynPKcs3CfFkpLF3u2lDhCBKtKZuaeM37rt7bq9fKVjiDk5W\r\nqxmjWCDJ2vOdCfJVSWXeapwZJc9+vX3LZzxR0CZ7S7k/W5wo2Dyx1puhE8xs\r\naTUx0cRYKDuDWTFoB7DqgNJ0GrduQbLym2Aq8LoT20vlOVvoies0zDOz3zYJ\r\ncTwqU4yUfz+JJqwQAk3YKHN+Az0IQ05rFY1Ffb/tKPiDnTi6LPeZ0blnrmoO\r\nR7UgXrN3VWg3ljY8I1WpAspWssfbvLYdZrQ=\r\n=1SOC\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-pg_0.16.3-60d4ce6_1674544754572_0.485022247226101"},"_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.3":{"name":"drizzle-orm-pg","version":"0.16.3","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.16 <0.17","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","_id":"drizzle-orm-pg@0.16.3","_integrity":"sha512-KohmZ3AbDP6waq3AG6+fMK7dkCmLJo2lWThioLDluveY/6E4Y44YLaWiZKg3dtq/SaawnyMa9jOy6FqLw29xyQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-KohmZ3AbDP6waq3AG6+fMK7dkCmLJo2lWThioLDluveY/6E4Y44YLaWiZKg3dtq/SaawnyMa9jOy6FqLw29xyQ==","shasum":"1ce9c1ec4d41bac4106f87a7625bb311c712330e","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.3.tgz","fileCount":218,"unpackedSize":314712,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGYjbqZBjmkUZKOSBf/6eXf4e+GJrg8eShelCcxw0LxuAiAO0tr3KboBYsYsjECE0kx/MPhFqm627n5Ynhim1/ocOA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjz4q9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrb+w//dlL0/6i+STp46g5Z7UiWkyrB/jVUXQ5KnDgSc29ldDJLHR9i\r\neQlYDBjXObnaPO4RqMVjHQBkngVTMcNbA24yKbgmnHIhwtvoulqgCfPtBs/h\r\nbJjJYW7tw25lhtvnQtKtnCuIIrWOC2qukrgG0rYdQRpr52vuvrpyuB9T+6LD\r\nUBpGK8bS+Z1KpbIj/k2/ua7R6x8Io/Xcmtev6aLPwHHb3nNNnWslzHqzyE55\r\n23GfLqyc3V0KkXQSCLCzsIIBAUV4h/IoJ35mVQVxN37Oh/N+iJxzV0n0IL28\r\n48ssRmro2LgNYvz2RwTlHIxsN/ECccNuAEYXxNGs150CbgRYFaTTUuey/v+n\r\nfG5JNtaK0Qrs2kmE11v2D28IySZ9V2EKtrBFPcLJXhxFOQOXgEDKtDV0xBmf\r\nFpqufn6/VOPppp1QqhwgG9Hy5FEEu6SiiB9GR0OSW41nJBBPAXfTvSHQaWNf\r\n52fxgJG/XKGVMR4RvHjqel0Ta8t78AZN9UGklGaNNVXpDocdA+oswDJZULsj\r\nrJsyJNSR61p6EcQC88r/Tzw/550JHJHY3di/3XVVdQrvZqosdq8GUNjUDdwz\r\ncUWAhXI155Zv1z+9Nbx7SgxhTr8ZV69bfb83/Gey3btJkrxrSHc6544vsGv+\r\nw4z54ahgOABGWNqM+CxVvfM6lb4Xl2GIhKE=\r\n=2XMo\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-pg_0.16.3_1674545853407_0.25527654435150504"},"_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.3-78fb61e":{"name":"drizzle-orm-pg","version":"0.16.3-78fb61e","description":"Drizzle ORM package for PostgreSQL database","scripts":{"build":"tsc --build && 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","pg","postgres","postgresql","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/pg":">=8 <9","drizzle-orm":">=0.16 <0.17","pg":">=8 <9","postgres":">=3 <4","@neondatabase/serverless":">=0.1 <0.2"},"peerDependenciesMeta":{"pg":{"optional":true},"@types/pg":{"optional":true},"postgres":{"optional":true},"@neondatabase/serverless":{"optional":true}},"devDependencies":{"@neondatabase/serverless":"^0.1.13","@types/pg":"^8.6.5","drizzle-orm":"link:../drizzle-orm/dist","pg":"^8.8.0","postgres":"^3.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\r\n<h1>Drizzle ORM | PostgreSQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-pg?label='></a></h1>\r\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-pg'>\r\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-pg'>\r\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\r\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\r\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\r\n<hr />\r\n</div>\r\n\r\nDrizzle ORM is a TypeScript ORM for SQL databases designed with maximum type safety in mind. It comes with a [drizzle-kit](https://github.com/drizzle-team/drizzle-kit-mirror) CLI companion for automatic SQL migrations generation. This is the documentation for Drizzle ORM version for PostgreSQL.\r\n\r\n| Driver | Support | | Driver version |\r\n| :- | :-: | :-: | :-: |\r\n| [node-postgres](https://github.com/brianc/node-postgres) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/pg'> |\r\n| [postgres.js](https://github.com/porsager/postgres) | ✅ | [Docs](/drizzle-orm-pg/src/postgres.js/README.md) | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/postgres'> |\r\n| [NeonDB Serverless](https://github.com/neondatabase/serverless) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-pg/peer/@neondatabase/serverless'> |\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm i drizzle-orm drizzle-orm-pg pg\r\nnpm i -D @types/pg\r\nnpm i -D drizzle-kit\r\n\r\n# yarn\r\nyarn add drizzle-orm drizzle-orm-pg pg\r\nyarn add -D @types/pg\r\nyarn add -D drizzle-kit\r\n\r\n# pnpm\r\npnpm add drizzle-orm drizzle-orm-pg pg\r\npnpm add -D @types/pg\r\npnpm add -D drizzle-kit\r\n```\r\n\r\n## SQL schema declaration\r\n\r\nIn Drizzle ORM, you declare SQL schema with TypeScript. You can either have a single `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\r\n\r\n### Single schema file example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📜schema.ts\r\n```\r\n\r\n### Multiple schema files example\r\n\r\n```plaintext\r\n📦 <project root>\r\n └ 📂 src\r\n    └ 📂 db\r\n       └ 📂 schema\r\n          ├ 📜users.ts\r\n          ├ 📜countries.ts\r\n          ├ 📜cities.ts\r\n          ├ 📜products.ts\r\n          ├ 📜clients.ts\r\n          ├ 📜enums.ts\r\n          └ 📜etc.ts\r\n```\r\n\r\n## Quick start\r\n\r\n```typescript\r\n// schema.ts\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n```\r\n\r\n### Connect using node-postgres Pool (recommended)\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Pool } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst pool = new Pool({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nconst db = drizzle(pool);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n### Connect using node-postgres Client\r\n\r\n```typescript\r\n// db.ts\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { Client } from 'pg';\r\n\r\nimport { users } from './schema';\r\n\r\nconst client = new Client({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\n// or\r\nconst client = new Client({\r\n  host: '127.0.0.1',\r\n  port: 5432,\r\n  user: 'postgres',\r\n  password: 'password',\r\n  database: 'db_name',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst db = drizzle(client);\r\n\r\nconst allUsers = await db.select(users);\r\n```\r\n\r\n## Schema declaration\r\n\r\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).\r\n\r\n```typescript\r\nimport { pgEnum, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm-pg';\r\n\r\n// declaring enum in database\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']);\r\n\r\nexport const countries = pgTable('countries', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n}, (countries) => {\r\n  return {\r\n    nameIndex: uniqueIndex('name_idx').on(countries.name),\r\n  }\r\n});\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id),\r\n  popularity: popularityEnum('popularity'),\r\n});\r\n```\r\n\r\n### Database and table entity types\r\n\r\n```typescript\r\nimport { pgTable, InferModel, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle, NodePgDatabase } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: text('full_name'),\r\n  phone: varchar('phone', { length: 256 }),\r\n});\r\n\r\nexport type User = InferModel<typeof users>; // return type when queried\r\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\r\n...\r\n\r\n// init node-postgres Pool or Client\r\nconst pool = new Pool(...);\r\n\r\nexport const db: NodePgDatabase = drizzle(pool);\r\n\r\nconst result: User[] = await db.select(users);\r\n\r\nexport async function insertUser(user: NewUser): Promise<User> {\r\n  return db.insert(users).values(user).returning();\r\n}\r\n```\r\n\r\n### Declaring indexes and foreign keys\r\n\r\n```typescript\r\nimport { foreignKey, index, uniqueIndex, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const countries = pgTable('countries', {\r\n    id: serial('id').primaryKey(),\r\n    name: varchar('name', { length: 256 }),\r\n    population: integer('population'),\r\n  }, (countries) => {\r\n    return {\r\n      nameIdx: index('name_idx').on(countries.name), // one column\r\n      namePopulationIdx: index('name_population_idx').on(countries.name, countries.population), // multiple columns\r\n      uniqueIdx: uniqueIndex('unique_idx').on(countries.name), // unique index\r\n    }\r\n  })\r\n);\r\n\r\nexport const cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: varchar('name', { length: 256 }),\r\n  countryId: integer('country_id').references(() => countries.id), // inline foreign key\r\n  countryName: varchar('country_id'),\r\n}, (cities) => {\r\n  return {\r\n    // explicit foreign key with 1 column\r\n    countryFk: foreignKey({\r\n      columns: [cities.countryId],\r\n      foreignColumns: [countries.id],\r\n    }),\r\n    // explicit foreign key with multiple columns\r\n    countryIdNameFk: foreignKey({\r\n      columns: [cities.countryId, cities.countryName],\r\n      foreignColumns: [countries.id, countries.name],\r\n    },\r\n  }\r\n}));\r\n\r\n// Index declaration reference\r\nindex('name')\r\n  .on(table.column1, table.column2, ...)\r\n  .onOnly(table.column1, table.column2, ...)  \r\n  .concurrently()\r\n  .using(sql``) // sql expression\r\n  .asc()\r\n  .desc()\r\n  .nullsFirst()\r\n  .nullsLast()\r\n  .where(sql``) // sql expression\r\n```\r\n\r\n## Column types\r\n\r\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).\r\n\r\n```typescript\r\nexport const popularityEnum = pgEnum('popularity', ['unknown', 'known', 'popular']); // declare enum type\r\npopularityEnum('column_name') // declare enum column\r\n\r\nsmallint('...')\r\ninteger('...')\r\nbigint('...', { mode: 'number' | 'bigint' })\r\n\r\nboolean('...')\r\ntext('...');\r\ntext<'one' | 'two' | 'three'>('...');\r\nvarchar('...');\r\nvarchar<'one' | 'two' | 'three'>('...');\r\nvarchar('...', { length: 256 }); // with length limit\r\n\r\nserial('...');\r\nbigserial('...', { mode: 'number' | 'bigint' });\r\n\r\ndecimal('...', { precision: 100, scale: 2 });\r\nnumeric('...', { precision: 100, scale: 2 });\r\n\r\nreal('...')\r\ndoublePrecision('...')\r\n\r\njson<...>('...');\r\njson<string[]>('...');\r\njsonb<...>('...');\r\njsonb<string[]>('...');\r\n\r\ntime('...')\r\ntime('...', { precision: 6, withTimezone: true })\r\ntimestamp('...')\r\ntimestamp('...', { mode: 'date' | 'string', precision: 0..6, withTimezone: true })\r\ntimestamp('...').defaultNow()\r\ndate('...')\r\ndate('...', { mode: 'string' | 'date' })\r\ninterval('...')\r\ninterval('...', { fields: 'day' | 'month' | '...' , precision: 0..6 })\r\n\r\ncolumn.primaryKey()\r\ncolumn.notNull()\r\ncolumn.defaultValue(...)\r\ntimeColumn.defaultNow()\r\nuuidColumn.defaultRandom()\r\n```\r\n\r\n## Table schemas\r\n\r\nDrizzle won't append any schema before table definition by default. So if your tables are in `public` schema drizzle generate -> `select * from \"users\"`\r\n\r\nBut if you will specify any custom schema you want, then drizzle will generate -> `select * from \"custom_schema\".\"users\"`\r\n\r\n> **Warning**\r\n> If you will have tables with same names in different schemas then drizzle will respond with `never[]` error in result types and error from database\r\n>\r\n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-pg#join-aliases-and-self-joins)\r\n\r\n### Usage example\r\n\r\n```typescript\r\n// Table in default schema\r\nconst publicUsersTable = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n\r\n\r\n// Table in custom schema\r\nconst mySchema = pgSchema('mySchema');\r\n\r\nconst usersTable = mySchema('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name').notNull(),\r\n  verified: boolean('verified').notNull().default(false),\r\n  jsonb: jsonb<string[]>('jsonb'),\r\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\r\n});\r\n```\r\n\r\n## Select, Insert, Update, Delete\r\n\r\n### Select\r\n\r\nQuerying, sorting and filtering. We also support partial select.\r\n\r\n```typescript\r\n...\r\nimport { pgTable, serial, text, varchar } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('full_name'),\r\n});\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.select(users);\r\nawait db.select(users).where(eq(users.id, 42));\r\n\r\n// you can combine filters with eq(...) or or(...)\r\nawait db.select(users)\r\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\r\n\r\nawait db.select(users)\r\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\r\n\r\n// partial select\r\nconst result = await db.select(users).fields({\r\n    mapped1: users.id,\r\n    mapped2: users.name,\r\n  });\r\nconst { mapped1, mapped2 } = result[0];\r\n\r\n// limit, offset & order by\r\nawait db.select(users).limit(10).offset(10);\r\nawait db.select(users).orderBy(asc(users.name));\r\nawait db.select(users).orderBy(desc(users.name));\r\n// you can pass multiple order args\r\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\r\n\r\n// list of all filter operators\r\neq(column, value)\r\neq(column1, column2)\r\nne(column, value)\r\nne(column1, column2)\r\n\r\nnotEq(column, value)\r\nless(column, value)\r\nlessEq(column, value)\r\n\r\ngt(column, value)\r\ngt(column1, column2)\r\ngte(column, value)\r\ngte(column1, column2)\r\nlt(column, value)\r\nlt(column1, column2)\r\nlte(column, value)\r\nlte(column1, column2)\r\n\r\nisNull(column)\r\nisNotNull(column)\r\n\r\ninArray(column, values[])\r\ninArray(column, sqlSubquery)\r\nnotInArray(column, values[])\r\nnotInArray(column, sqlSubquery)\r\n\r\nexists(sqlSubquery)\r\nnotExists(sqlSubquery)\r\n\r\nbetween(column, min, max)\r\nnotBetween(column, min, max)\r\n\r\nlike(column, value)\r\nlike(column, value)\r\nilike(column, value)\r\nnotIlike(column, value)\r\n\r\nnot(sqlExpression)\r\n\r\nand(expressions: SQL[])\r\nor(expressions: SQL[])\r\n```\r\n\r\n### Insert\r\n\r\n```typescript\r\nimport { pgTable, serial, text, timestamp, InferModel } from 'drizzle-orm-pg';\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  createdAt: timestamp('created_at'),\r\n});\r\n\r\ntype NewUser = InferModel<typeof users>;\r\n\r\nconst db = drizzle(...);\r\n\r\nawait db.insert(users)\r\n  .values({\r\n    name: 'Andrew',\r\n    createdAt: new Date(),\r\n  });\r\n\r\n// accepts vararg of items\r\nawait db.insert(users)\r\n  .values(\r\n    {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n    },\r\n    {\r\n      name: 'Dan',\r\n      createdAt: new Date(),\r\n    },\r\n  );\r\n\r\nconst newUsers: NewUser[] = [\r\n  {\r\n      name: 'Andrew',\r\n      createdAt: new Date(),\r\n  },\r\n  {\r\n    name: 'Dan',\r\n    createdAt: new Date(),\r\n  },\r\n];\r\n\r\nawait db.insert(users).values(...newUsers);\r\n\r\nconst insertedUsers: NewUser[] = await db.insert(users).values(...newUsers).returning();\r\n\r\nconst insertedUsersIds: { insertedId: number }[] = await db.insert(users)\r\n    .values(...newUsers)\r\n    .returning({ insertedId: users.id });\r\n```\r\n\r\n### Upsert (Insert with on conflict statement)\r\n\r\n```typescript\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'Dan' })\r\n  .onConflictDoUpdate({ target: users.id, set: { name: 'John' } });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing();\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoNothing({ target: users.id });\r\n\r\nawait db.insert(users)\r\n  .values({ id: 1, name: 'John' })\r\n  .onConflictDoUpdate({\r\n    target: users.id,\r\n    set: { name: 'John1' },\r\n    where: sql`${users.createdAt} > '2023-01-01'::date`,\r\n  });\r\n```\r\n\r\n### Update and Delete\r\n\r\n```typescript\r\nawait db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst updatedUser: InferModel<typeof users> = await db.delete(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst updatedUserId: { updatedId: number }[] = await db.update(users)\r\n  .set({ name: 'Mr. Dan' })\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ updatedId: users.id });\r\n\r\nawait db.delete(users)\r\n  .where(eq(users.name, 'Dan'));\r\n\r\nconst deletedUser: InferModel<typeof users> = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning();\r\n\r\nconst deletedUserId: { deletedId: number }[] = await db.delete(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .returning({ deletedId: users.id });\r\n```\r\n\r\n### Joins\r\n\r\nLast but not least. Probably the most powerful feature in the library🚀\r\n\r\n#### Many-to-one\r\n\r\n```typescript\r\nconst cities = pgTable('cities', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n  cityId: integer('city_id').references(() => cities.id),\r\n});\r\n\r\nconst result = db.select(cities)\r\n  .leftJoin(users, eq(cities2.id, users2.cityId));\r\n```\r\n\r\n#### Many-to-many\r\n\r\n```typescript\r\nconst users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst chatGroups = pgTable('chat_groups', {\r\n  id: serial('id').primaryKey(),\r\n  name: text('name'),\r\n});\r\n\r\nconst usersToChatGroups = pgTable('usersToChatGroups', {\r\n  userId: integer('user_id').notNull().references(() => users.id),\r\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\r\n});\r\n\r\n// querying user group with id 1 and all the participants(users)\r\nconst result = await db.select(usersToChatGroups)\r\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\r\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\r\n  .where(eq(chatGroups.id, 1));\r\n```\r\n\r\n#### Join aliases and self-joins\r\n\r\n```typescript\r\nimport { ..., alias } from 'drizzle-orm-pg';\r\n\r\nexport const files = pgTable('folders', {\r\n  name: text('name').notNull(),\r\n  parent: text('parent_folder')\r\n})\r\n\r\nconst nestedFiles = alias(files, 'nested_files');\r\n\r\n// will return files and folders and nested files for each folder at root dir\r\nconst result = await db.select(files)\r\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\r\n  .where(eq(files.parent, '/'));\r\n```\r\n\r\n#### Join using partial select\r\n\r\n```typescript\r\n// Select user ID and city ID and name\r\nconst result1 = await db.select(cities).fields({\r\n  userId: users.id,\r\n  cityId: cities.id,\r\n  cityName: cities.name,\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n\r\n// Select all fields from users and only id and name from cities\r\nconst result2 = await db.select(cities).fields({\r\n  // Supports any level of nesting!\r\n  user: users,\r\n  city: {\r\n    id: cities.id,\r\n    name: cities.name,\r\n  },\r\n}).leftJoin(users, eq(users.cityId, cities.id));\r\n```\r\n\r\n## Prepared statements\r\n\r\n```typescript\r\nconst query = db.select(users)\r\n  .where(eq(users.name, 'Dan'))\r\n  .prepare();\r\n\r\nconst result = await query.execute();\r\n```\r\n\r\n### Prepared statements with parameters\r\n\r\n```typescript\r\nimport { placeholder } from 'drizzle-orm-pg';\r\n\r\nconst query = db.select(users)\r\n  .where(eq(users.name, placeholder('name')))\r\n  .prepare();\r\n\r\nconst result = await query.execute({ name: 'Dan' });\r\n```\r\n\r\n## Raw queries execution\r\n\r\nIf you have some complex queries to execute and drizzle-orm can't handle them yet, you can use the `db.execute` method to execute raw queries.\r\n\r\n```typescript\r\n// it will automatically run a parametrized query!\r\nconst res: QueryResult<{ id: number; name: string }> = await db.execute<\r\n  { id: number; name: string }\r\n>(sql`select * from ${users} where ${users.id} = ${userId}`);\r\n```\r\n\r\n## Migrations\r\n\r\n### Automatic SQL migrations generation with drizzle-kit\r\n\r\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 deletions and renames by prompting user input.\r\n\r\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\r\n\r\nFor schema file:\r\n\r\n```typescript\r\nimport { index, integer, pgTable, serial, varchar } from 'drizzle-orm-pg';\r\n\r\nexport const users = pgTable('users', {\r\n  id: serial('id').primaryKey(),\r\n  fullName: varchar('full_name', { length: 256 }),\r\n}, (users) => ({\r\n  nameIdx: index('name_idx').on(users.fullName),\r\n}));\r\n\r\nexport const authOtps = pgTable('auth_otp', {\r\n  id: serial('id').primaryKey(),\r\n  phone: varchar('phone', { length: 256 }),\r\n  userId: integer('user_id').references(() => users.id),\r\n}\r\n```\r\n\r\nIt will generate:\r\n\r\n```SQL\r\nCREATE TABLE IF NOT EXISTS auth_otp (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'phone' character varying(256),\r\n  'user_id' INT\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS users (\r\n  'id' SERIAL PRIMARY KEY,\r\n  'full_name' character varying(256)\r\n);\r\n\r\nDO $$ BEGIN\r\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ('user_id') REFERENCES users(id);\r\nEXCEPTION\r\n WHEN duplicate_object THEN null;\r\nEND $$;\r\n\r\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\r\n```\r\n\r\nAnd you can run migrations manually or using our embedded migrations module\r\n\r\n```typescript\r\nimport { drizzle } from 'drizzle-orm-pg/node';\r\nimport { migrate } from 'drizzle-orm-pg/node/migrator';\r\nimport { Pool } from 'pg';\r\n\r\nconst pool = new Pool({\r\n  connectionString: 'postgres://user:password@host:port/db',\r\n});\r\nconst db = drizzle(pool);\r\n\r\n// this will automatically run needed migrations on the database\r\nawait migrate(db, { migrationsFolder: './drizzle' });\r\n```\r\n","readmeFilename":"README.md","_id":"drizzle-orm-pg@0.16.3-78fb61e","_integrity":"sha512-km6R7HNMejGUh66rorItMsVjORWC8sQ6Fj4yRwqpMhjkQn2VH9tbscYzT9k3Vqju4ZsX7IimBNUyO5zC9DouQw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-pg/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-km6R7HNMejGUh66rorItMsVjORWC8sQ6Fj4yRwqpMhjkQn2VH9tbscYzT9k3Vqju4ZsX7IimBNUyO5zC9DouQw==","shasum":"11a790927e7c6baf8c58be36b20402e49c05e9ba","tarball":"https://registry.npmjs.org/drizzle-orm-pg/-/drizzle-orm-pg-0.16.3-78fb61e.tgz","fileCount":218,"unpackedSize":314720,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1dIp228ewFP79q5mAr4ScSpYthZJPMzUCNVpUkCpwhgIgCIvDSixzYF9smaQUb94xo/hW4kldP7Z6oTzFHp3KEu0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj0ZhhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmophQ/+IUZYjPIiGrStLQi9yyMJvc8tSsWyg5TxDffjgky1seMLSiDh\r\nfkz/W3CHAi355daQw1xpj4nApTSax4LhZwez2rkR/KL6Ky31gr7VhGge2ipV\r\nd8FtGZdY0V0v2fNMWfWYeQo/UFsCIQEFyDwjzWXdmBuRBAi1j+X3h3p4AK3w\r\nS8woZxqEzgtAkn8yF97CstIoTaXD6OPi7ap7Vsg6Hhvqy0qYN4pYsGfpPoJz\r\nrT+bEE7j+lKFikVq+OupcGfdBbhCl4yCV5IqWBmuXgfNl58Aewn6phCp0OyB\r\n6jZIcwKBcUv+2w9aT1Z0Fe1Y+O+lpU+EBOifveeKatfZZzJcTqKgBqIUJsyL\r\noUfJDFlMfxu34OqH70oSVAtXLM365/rU+1l/MTlOMqN6rAGyoTTWevn5NU7U\r\nvkPsD1ixlyVVpV/TUdNa3HNf8Lo0KdmKGn/r2s6MpU9UmN69bnW1JZUqfz9G\r\nFqqDQjGIy3J8dZJ0qG3cXE3EJAdmo/r5VMBH6mAnzRwr0MPDiV9XsGTh2MEE\r\nM92D6p5xlRyejp5xc2E1wIkaPpBa9+j+rWpbEFwDXMoxvFcARnEZDRxE/GV5\r\nXO8KhwvCXIhxz0gF/mT2hRkuz7gXdkVLoErm+iei7BbNyduJvprap/Rp+osI\r\nsDAUsJaQgloYXt1FUOLF0/+WwU/qJr4lPqw=\r\n=lOEI\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-pg_0.16.3-78fb61e_1674680416781_0.5387122495222725"},"_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-08-04T07:35:29.151Z","0.12.0-beta.0":"2022-08-04T07:35:29.547Z","modified":"2024-05-24T19:50:51.805Z","0.12.0-beta.1":"2022-08-04T08:47:27.120Z","0.12.0-beta.2":"2022-08-04T13:31:05.478Z","0.12.0-beta.3":"2022-08-04T14:22:10.724Z","0.12.0-beta.4":"2022-08-08T14:05:43.961Z","0.12.0-beta.5":"2022-08-08T14:35:27.969Z","0.12.0-beta.6":"2022-08-23T18:06:38.872Z","0.12.0-beta.7":"2022-08-23T20:37:10.013Z","0.12.0-beta.8":"2022-09-05T12:51:44.453Z","0.12.0-beta.9":"2022-09-05T14:24:45.943Z","0.12.0-beta.10":"2022-09-05T14:35:03.353Z","0.12.0-beta.11":"2022-09-06T12:20:42.040Z","0.12.0-beta.12":"2022-09-06T13:37:40.194Z","0.12.0-beta.13":"2022-09-06T13:42:39.556Z","0.12.0-beta.14":"2022-09-08T13:24:21.038Z","0.12.0-beta.15":"2022-09-08T13:27:46.636Z","0.12.0-beta.16":"2022-09-11T14:07:29.443Z","0.12.0-beta.17":"2022-09-11T14:27:55.818Z","0.12.0-beta.18":"2022-09-13T11:29:46.073Z","0.12.0-beta.19":"2022-09-13T12:01:20.545Z","0.12.0-beta.20":"2022-09-14T08:44:27.977Z","0.12.0-beta.22":"2022-09-25T11:12:35.417Z","0.12.0-beta.24":"2022-09-28T12:33:13.237Z","0.12.0-beta.25":"2022-09-28T14:13:33.299Z","0.12.0-beta.26":"2022-10-20T11:52:26.751Z","0.12.0-beta.27":"2022-10-20T12:56:54.148Z","0.12.0-beta.28":"2022-10-20T13:09:52.707Z","0.12.0-beta.29":"2022-10-31T16:45:38.682Z","0.12.0-beta.30":"2022-11-01T18:33:19.548Z","0.12.0-beta.31":"2022-11-02T12:01:49.092Z","0.12.0-beta.32":"2022-11-03T10:42:15.240Z","0.12.0-beta.33":"2022-11-03T14:49:13.570Z","0.12.0-beta.34":"2022-11-04T09:17:39.321Z","0.12.0-beta.35":"2022-11-07T11:56:20.975Z","0.12.0-beta.36":"2022-11-14T10:26:06.365Z","0.12.0-beta.37":"2022-11-16T15:16:56.241Z","0.12.0-beta.38":"2022-11-21T13:54:48.383Z","0.12.0-beta.39":"2022-11-21T15:05:36.195Z","0.12.0-beta.40":"2022-12-08T15:48:16.948Z","0.13.0":"2022-12-08T16:34:09.678Z","0.13.1":"2022-12-09T12:18:06.317Z","0.13.2":"2022-12-09T13:20:21.481Z","0.13.3-beta.1":"2022-12-09T17:02:02.368Z","0.13.3-beta.2":"2022-12-09T18:23:45.315Z","0.13.4":"2022-12-12T13:45:59.871Z","0.13.4-6924c130cdaa28e770d96cb4300615910eaa3da6":"2022-12-12T15:12:17.365Z","0.13.4-7d422f2":"2022-12-12T15:24:37.968Z","0.13.4-a61a883":"2022-12-12T15:50:17.996Z","0.13.4-6a923f2":"2022-12-12T15:53:29.749Z","0.14.0-a7bfec3":"2022-12-12T17:37:21.895Z","0.14.0":"2022-12-12T17:39:08.842Z","0.13.4-cd3f5e4":"2022-12-13T10:26:16.364Z","0.14.0-beta.1-44e9f79":"2022-12-13T10:48:19.855Z","0.14.0-beta.1":"2022-12-13T10:48:35.286Z","0.14.0-beta.2-f67992c":"2022-12-13T12:25:05.476Z","0.14.0-beta.2":"2022-12-13T12:26:06.386Z","0.14.0-beta.3":"2022-12-13T12:28:35.908Z","0.14.0-beta.4":"2022-12-13T12:30:52.059Z","0.14.0-beta.4-a4036d1":"2022-12-13T15:38:36.575Z","0.14.0-beta.4-29bad0a":"2022-12-13T15:40:29.311Z","0.14.0-beta.4-97a60e2":"2022-12-13T15:44:54.244Z","0.14.0-beta.4-a35bf74":"2022-12-13T15:48:36.925Z","0.14.0-beta.4-502278b":"2022-12-14T12:07:54.287Z","0.13.4-efa4dda":"2022-12-15T11:46:17.403Z","0.13.4-f115120":"2022-12-15T11:50:52.040Z","0.13.4-03f651b":"2022-12-15T11:59:02.895Z","0.14.1":"2022-12-15T14:07:06.963Z","0.14.1-bad61c5":"2022-12-15T14:53:26.442Z","0.14.1-f92529c":"2022-12-15T14:56:07.657Z","0.14.1-7d1d823":"2022-12-15T15:02:08.524Z","0.14.1-1f44b00":"2022-12-15T22:30:36.231Z","0.14.1-1c58471":"2022-12-15T22:32:34.565Z","0.14.1-1d98f11":"2022-12-15T22:34:06.617Z","0.14.1-f617bb6":"2022-12-16T10:46:05.013Z","0.14.1-c5dca58":"2022-12-16T11:00:32.880Z","0.14.2-3793d78":"2022-12-16T11:16:29.937Z","0.14.2":"2022-12-16T11:19:11.022Z","0.14.2-3967f06":"2022-12-16T11:22:02.740Z","0.14.2-e902ba8":"2022-12-16T13:27:00.257Z","0.13.4-9f4af29":"2022-12-19T17:22:24.639Z","0.14.2-a52eacc":"2022-12-19T17:44:20.304Z","0.14.2-5514014":"2022-12-19T17:45:25.466Z","0.14.2-cc06fec":"2022-12-19T17:45:59.036Z","0.14.2-c7344a5":"2022-12-19T17:46:52.296Z","0.14.3-01c3d82":"2022-12-20T18:19:03.889Z","0.14.3":"2022-12-20T18:21:14.530Z","0.14.3-4eada6d":"2022-12-21T17:51:09.348Z","0.14.3-1e42665":"2022-12-21T18:00:27.151Z","0.14.3-c153bbf":"2022-12-21T18:08:02.847Z","0.14.3-e295848":"2022-12-21T18:08:11.854Z","0.14.3-6f226c1":"2022-12-21T18:10:35.879Z","0.14.3-f8d0d46":"2022-12-21T18:11:37.392Z","0.14.3-cce4cab":"2022-12-21T18:15:36.694Z","0.14.3-314c1fa":"2022-12-21T18:48:49.810Z","0.13.4-b8ae68d":"2022-12-22T15:08:55.817Z","0.13.4-099a94f":"2022-12-22T15:11:03.782Z","0.13.4-a486088":"2022-12-22T20:19:37.629Z","0.13.4-d68193c":"2022-12-22T20:26:21.262Z","0.13.4-671a09e":"2022-12-22T20:37:35.214Z","0.14.3-5b14ef4":"2022-12-22T21:02:09.417Z","0.14.3-9ba6169":"2022-12-29T11:33:01.864Z","0.15.0-5ce7d69":"2023-01-02T18:46:00.365Z","0.15.0-4e3a5b9":"2023-01-05T11:32:57.773Z","0.15.0-dd27c86":"2023-01-05T15:26:00.507Z","0.15.0-67805d4":"2023-01-05T15:34:29.443Z","0.14.3-1bcee50":"2023-01-05T19:36:19.029Z","0.15.0-07f606f":"2023-01-06T14:31:38.216Z","0.15.0-a90d3bc":"2023-01-06T19:03:19.974Z","0.15.0-7d17618":"2023-01-08T14:32:21.183Z","0.14.4-59f0a3a":"2023-01-09T14:32:39.583Z","0.14.4":"2023-01-09T14:36:21.101Z","0.15.0-2e1e5b2":"2023-01-10T11:26:18.666Z","0.15.0-60954a3":"2023-01-10T13:56:04.770Z","0.15.0":"2023-01-10T14:06:25.214Z","0.15.0-88523f9":"2023-01-12T13:56:06.200Z","0.15.1-f67dd9d":"2023-01-12T14:44:22.587Z","0.15.1-80901ff":"2023-01-12T14:47:40.960Z","0.15.1-4a5b2e3":"2023-01-12T15:59:01.239Z","0.15.1-9728cc6":"2023-01-12T16:35:22.669Z","0.15.1-19c5c02":"2023-01-12T16:48:30.495Z","0.15.1-3548c99":"2023-01-12T17:14:46.639Z","0.15.1-a1b76f5":"2023-01-13T10:34:55.886Z","0.15.1":"2023-01-13T12:08:34.261Z","0.15.1-656bcc3":"2023-01-13T14:24:00.118Z","0.15.2-6879c1d":"2023-01-14T10:54:07.976Z","0.15.2-1766537":"2023-01-14T11:29:26.275Z","0.15.2-2b4d90d":"2023-01-14T11:49:20.520Z","0.15.2":"2023-01-16T14:07:45.136Z","0.15.2-52e75f5":"2023-01-16T14:40:41.150Z","0.15.3-c675dde":"2023-01-16T14:56:33.234Z","0.15.3":"2023-01-16T15:01:43.941Z","0.15.3-1e62a3e":"2023-01-16T16:08:25.316Z","0.15.3-72fb2c0":"2023-01-16T16:43:10.720Z","0.15.3-23baedd":"2023-01-16T18:05:23.988Z","0.15.3-844cb31":"2023-01-16T18:48:15.103Z","0.15.3-98b2097":"2023-01-16T20:00:54.729Z","0.15.3-0dcbb16":"2023-01-16T20:01:52.620Z","0.15.4-335d188":"2023-01-17T19:34:26.632Z","0.15.3-b422bc1":"2023-01-18T15:52:01.536Z","0.15.3-b3dd40c":"2023-01-18T16:04:25.312Z","0.15.3-71be15e":"2023-01-18T16:20:07.068Z","0.15.3-30915c1":"2023-01-18T16:20:41.079Z","0.15.3-36368e7":"2023-01-19T08:15:27.893Z","0.15.3-adba448":"2023-01-19T09:14:00.278Z","0.15.3-bbe577c":"2023-01-19T10:13:13.538Z","0.15.3-1c43305":"2023-01-19T10:58:30.776Z","0.15.3-f77c6c2":"2023-01-19T11:01:58.502Z","0.15.3-1f6c448":"2023-01-19T11:04:55.630Z","0.15.3-d8f67aa":"2023-01-19T11:08:07.231Z","0.16.0-11f7ff3":"2023-01-19T16:32:10.875Z","0.16.0-3e17d6e":"2023-01-19T19:23:17.562Z","0.16.0":"2023-01-19T19:51:17.148Z","0.16.1-56d16f9":"2023-01-19T20:34:34.586Z","0.16.1-b4b5a09":"2023-01-19T20:40:21.860Z","0.16.1-ddf4681":"2023-01-19T20:50:27.842Z","0.16.0-484a8ae":"2023-01-20T07:52:28.353Z","0.16.0-af45b90":"2023-01-20T13:20:19.130Z","0.16.1-b9e9ba0":"2023-01-20T13:39:33.419Z","0.16.1-4124cf0":"2023-01-20T13:48:40.218Z","0.16.1-51c77ba":"2023-01-20T13:50:54.413Z","0.16.1":"2023-01-20T13:58:16.974Z","0.16.2-cf5a510":"2023-01-20T14:47:40.959Z","0.16.2":"2023-01-20T14:55:54.496Z","0.16.2-c522f26":"2023-01-20T15:03:20.748Z","0.16.2-97f9977":"2023-01-21T11:16:23.577Z","0.16.2-43776eb":"2023-01-22T13:31:34.263Z","0.16.2-2c4c5b1":"2023-01-24T07:10:45.151Z","0.16.3-60d4ce6":"2023-01-24T07:19:14.716Z","0.16.3":"2023-01-24T07:37:33.663Z","0.16.3-78fb61e":"2023-01-25T21:00:17.021Z"},"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 PostgreSQL database","homepage":"https://github.com/drizzle-team/drizzle-orm#readme","keywords":["orm","pg","postgres","postgresql","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"}}