{"_id":"drizzle-orm-mysql","_rev":"153-402cd3dbba681ef241e50acc0d5dd67d","name":"drizzle-orm-mysql","dist-tags":{"latest":"0.16.2","beta":"0.16.0-3e17d6e","feature/mysql-support":"0.14.2-3793d78","pipeline-add-mysql":"0.14.2-3967f06","docs-1":"0.14.2-c7344a5","AndriiSherman-patch-1":"0.14.2-314c1fa","feature/index-name":"0.14.2-67805d4","feature/pg-aws-dataapi":"0.15.1-2b4d90d","feature/sqlite-wasm":"0.16.1-43776eb"},"versions":{"0.12.0-beta.0":{"name":"drizzle-orm-mysql","version":"0.12.0-beta.0","description":"Drizzle ORM package for MySQL database","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.13.0 <0.14.0","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","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","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.0","_integrity":"sha512-WmtUogdJ5K9nrlped5wgEzJ4F0pdztncVk/6B67j0A5ysG7L1RsooELXhR+MZDEqZRU0DuLXHzLFSllY3iX0Yw==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-WmtUogdJ5K9nrlped5wgEzJ4F0pdztncVk/6B67j0A5ysG7L1RsooELXhR+MZDEqZRU0DuLXHzLFSllY3iX0Yw==","shasum":"bb7339fca279cd110daa4a52dbcdeeef4f5abeb6","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.0.tgz","fileCount":115,"unpackedSize":182041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDzOgbqUp7/xQYdtDD+Agd1Vy7a7tTNHz8VqDGQRsDlaAIgZAamMOhfxAfn6Kehvws/JJctw9bfzFVTwOygMLjjXwo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5OytACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmodQA/9EIBz6dqabXWZiasHAlmQhMxm//UQQSV1uTDlYGVPM884sFO0\r\nrNYN3m/UTAmuAUK8h0Vk7c6c2uz7U3hB51ruIRQd4omKxvzIbVusqhZ5CZ3h\r\nEhBX7Z0mFp0Pq113e3dJGjAMVVWt4C3U2cius8yxPjqYaZhmvLDpxptNQaLZ\r\nMJCEcOX1SCTdn6t6YaTlimxi4NxSjKJ43491XgQApv3r47A1/DtoJkwRwOwz\r\nyG2L13TwWbb5pHbuKs4o00DpxdUJ65bMTLDRDNQq2cyUC8h4EA2x/Ei8h52o\r\n/5DnwxrLSVNr+gRpR21bVVXg+beEGCNCHgeXhnPIjn5mw5juKd4hGbyhv6wu\r\ngWKRP6MRIq4sQPP9pid0wsfDkX7t4u+J1SN5lHjSqg3T/dmG/a/D7hPWfr7b\r\n22m+pej9154ZSji+AGOvWzS1f3LszJzK3TLrbJlYdYr4PlLdjudqCDaswian\r\n3Atm8kiPZ4YQn9dp/hOUKyulFRyiMj0fwzKdmqzwUXgamhVZMR+6yB+6Q9kZ\r\nPk02qECqq/4NOk788gzwjUHlL/tYOg5/6hj8TkF9WoljAS7gpvi++SFbWx6I\r\n2W12O1wREfNDGRg0li6rRYkBT6GvVs40vOCaZ8/pPYkOTEPUu98HM4utD5L5\r\nri2GWOLyYBawRWtKCYwbfvFOef+5NhB4hdw=\r\n=o4G0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sheriman","email":"andreysherman11@gmail.com"},"directories":{},"maintainers":[{"name":"sheriman","email":"andreysherman11@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.12.0-beta.0_1659169964840_0.9941496893709845"},"_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-mysql","version":"0.12.0-beta.1","description":"Drizzle ORM package for MySQL database","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.13.0 <0.14.0","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","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 --access public --git-checks false","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.1","_integrity":"sha512-2S8zkwrM95bZm/I/EI38nUxwEpMHe9zoEuXHa3C+zUqbtDjLClVw5KuewoVhzZOI6ttLDqTkfRIzj7hOZf/bIA==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-2S8zkwrM95bZm/I/EI38nUxwEpMHe9zoEuXHa3C+zUqbtDjLClVw5KuewoVhzZOI6ttLDqTkfRIzj7hOZf/bIA==","shasum":"a5c73853baad61836c29d69eba0b7f40ea6b4210","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.1.tgz","fileCount":115,"unpackedSize":182135,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFApV3sEdCJ71RFmn2QuKVQHYy9vnIrdMVHXCt4QldZ5AiEAuqyg3Fx9k1YL1KsOv7plFVxth6o5P4/NZb/KMIEWEG0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5O3WACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrEhxAAmaBSaznN6C8usRIp6KGt417Axa8ew826uQMPzLAy4Iydxdcc\r\nBxl7oeb7qqbe9WJ/cLIg6US89iHeNrBT+HNWfXDSOIA2pM38RI82+FQ04Ilb\r\n5wum9yraIMuAK39AWtVECyA2I0BxD0jhNjmx/GhM4b/g86g9gG2G2g5UVfLw\r\nc0spPttoma532Hd1CSsXUaCAaIUJEXTpr5VnKza8sYAq4QZFaKafllZXPUco\r\nxBz4aPxkxASPyy6gRPDlFtisYRXGB7uE+I7QYLKYzJBEnbO9uyQHtR7fJQam\r\n5Ph+jwv4FKYDfFcuuY0MclknZqvQDxBFNcZrLx7hdQ1qxHmTwoe7UQo+/x7y\r\nizrN8HqQSLmIn1oXlUNxp/ahx9y8YQdOznRLo+0L38s2rpsS28CPknJENQ12\r\n68kVxhdzOnDJDXuagbdHhUZni22oP0BReNknvR4fhObwqZxnao43WHbAiXPK\r\nKSqg5ePBVz5stF5SSeSKeQnGsCadH1JCvIkD9fFAhIYYcg99Kzp7di4GP6Cj\r\noF0PgnUCT5HSxAes1ME01Ev/aEANfMLpgnNjTDpqXvq5TncIWSBKm4zcJRYw\r\nUBiknAxE/ONhdS8RJNOHMi/V6omyhyaKR3EV7Q4GdJpBFJubjaTPAYqrEtEN\r\nI3HbMjrFb34OshRvvxQeyDu0rEXvr+FGclA=\r\n=og21\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sheriman","email":"andreysherman11@gmail.com"},"directories":{},"maintainers":[{"name":"sheriman","email":"andreysherman11@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.12.0-beta.1_1659170261875_0.9925268544638037"},"_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-mysql","version":"0.12.0-beta.2","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","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-mysql@0.12.0-beta.2","_integrity":"sha512-6UiNPyX5jrReQXhlJCCFxGALuGTctvTvLFKbtGBeLveRCvJk9UY+eGzDylonu+TP7z5uEWF4B538yZL+RYwrlA==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-6UiNPyX5jrReQXhlJCCFxGALuGTctvTvLFKbtGBeLveRCvJk9UY+eGzDylonu+TP7z5uEWF4B538yZL+RYwrlA==","shasum":"c86e38538085e041efc25293ce7cfb4f56af1d1a","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.2.tgz","fileCount":112,"unpackedSize":181431,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMzq/CDcQkYOdn0ZTjgk1P7l2pL1U2pEsaz2yEiZRGfAIhAJ8Ed619L8rvpDTrtf6+sqM2FhTTxpjkvGKOhKp0TRGF"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5SeLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq3Sg/+LNvkO+H8zcbR9WTA74I7qpaesQgfNoUywLckKjOswx5ibf+E\r\npuRcaqL/JgebuedfjrroCflHWmIrsMNLKIYcugR0yq1tus6v7S7aPy+zKBt8\r\n2XvwLdUlSJ3N57FzzDe65F6/ZTnsRsnQ6xN91cWBjcjb0L6B0dt/FzssqvkP\r\nnPVjR/YpxIJfNpYlPRjUBxVRSQbgY3PvukSAykSJZIa63C4SJXRD8Kj2UJ1+\r\nFluO6HvJQtlRphJIIay+Zc5dFkVSurNvGT6rULP3dgzePbRCwKJ5ayf86uX8\r\nqbAtKhlAXa8VqF/ufF291fo9p62FIqLXwfBeB1B9fgftAiGufCWSvjFfLHaz\r\nE5a+SbFGDgRxqCnTHHPEm+eYE1ktWWA42Lv6lgZFQDuidhlRQnyrKnLtOMf0\r\nKLepSPaXDk7n/POkHsw1RD5OJ28vHU17oRAcm2TVag1PIGBNclPFd/77dLRw\r\nmoTO6w7YQH5WIBq7VMDDf71SKaXO6FDHHpXHkAN/DZokXH/zaQ7enmqnsu/c\r\nROu2MdiHcsZbni8GYbq3EsvdWJgzqDVAM96J5JU5W0OHo4cNU9/aed5vqgYm\r\nHtJ9HbBbl+OqhuBeW5X7bryURZg/01kEvxpHBhk0sBhXj0Y0wq4PopShCD3j\r\nIJfFJy/LZ6PMXS6OHOZzKzcjP3WAJpzCjUU=\r\n=6nBy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.12.0-beta.2_1659185035544_0.7833089332540077"},"_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-mysql","version":"0.12.0-beta.3","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","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":"npm publish package.tgz --tag beta --git-checks false","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.3","_integrity":"sha512-BhSTswKW9RRDbJLtEBUW6yf/5CqOAuJ+N16DkzBfW/CGzNrXIDTozUiwLtWYYB0TLKj77QYBV8OkomYxG+0rxQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-BhSTswKW9RRDbJLtEBUW6yf/5CqOAuJ+N16DkzBfW/CGzNrXIDTozUiwLtWYYB0TLKj77QYBV8OkomYxG+0rxQ==","shasum":"301dc13b2918334b8ab17352336d42a8c717852f","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.3.tgz","fileCount":112,"unpackedSize":181506,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBxIaHP6e+zQIN3pjRFriNZkeOCO3yfDNK5bYJre5Y5SAiEAvBp36uekVic9iQazUkruMhHCNBXQARP1dI3VwkPbfcI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5r5WACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpJBxAAnBswdyyPjjsirv+Oouob1Hr91vkI8QG9MQa1P2CtMAG0kDUa\r\nz8SBlkknGI+EMPjTYUfRFQjinP6F3BCSdXXSBuyHfm8Zf+58EzrRPVKU8lGl\r\nWi0cyV3kry03OUXxCU0+kUjXqi4EyBRoxb+hU2I2ZvUK0kcDmoc6CBjmDoQX\r\n/YtaVNwm+aFYTpNiEXv5jVLfjd7CxpG1UOiRxNliQh5ziqCKb/+DPKA6Wfb9\r\nTZP29KSK46ueutZ0qr0ienOKJN3RozGWVPwkOWxRnBeJCF/QvA4+EDIHzk5A\r\nRrwwXqSScEk7E4ZK1RjqLPuUeKCyEW1oPOnKishKxWj9EcBbg/Su7pzBW+64\r\nyOPV9Jn/+fPA9o0PXHLlVnCZvJKjTU2KqvMXR/jWWWTk36ayxUMq7I1/pCBy\r\nICWgs1vlBO/dw7Fve7v7kfi/d/rdbTmZAG+vM7ly3FwRx6OTsvvaP2caR9G3\r\npF7Wtme5yGLxrvZTK2wMhO+bdVni+lRdPWhx4ePa58/0VzpcvlZtYMS/Sz+O\r\n+eqk4W+FhHP1PHSdQsPF2rpAAMefidZz7uSlEGOf6LWSce6WCY0ExjM+EP/0\r\n+dL8KKgsq/26WhuXZngQXTSlyTaUWYz6dXJiOVdr1wtl3Ps+lD4XeoyVi+dU\r\nxOpKfpNlluucCH+FEE1LXYOUn8/rB0F9GGo=\r\n=cCF5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.12.0-beta.3_1659289174668_0.5001145972720389"},"_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-mysql","version":"0.12.0-beta.4","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","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":"npm publish package.tgz --tag beta --git-checks false","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.4","_integrity":"sha512-HuCCg15ADuXdzMXic+Rqi8/pIp3/hPn0ErbaL4ZB7/mLNm7jb7PIdNvz5zYR7PkmxcePe8uBlDmb6zJteRwZoQ==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-HuCCg15ADuXdzMXic+Rqi8/pIp3/hPn0ErbaL4ZB7/mLNm7jb7PIdNvz5zYR7PkmxcePe8uBlDmb6zJteRwZoQ==","shasum":"1097fa6b279c7a9ee40aac86548d8eca800fc875","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.4.tgz","fileCount":118,"unpackedSize":187443,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA4vi6buHqQZ2o7p2sdEY5r/KisT/ZTGgedsbyR+4qUCAiBvfHVK/tzrGg9/sSQHCToUOU+sSSYIeIChj1+JKe2f9w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjAge4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpKXA//R7ZOegWrPpx+GFTh3RNF3stqPqH1n4CEE3N4BgQERSbvmCHa\r\nRaE12V8qUjlKJeWQNoLDoTnZGYJaExaJ2flq4Qb/cw7blo24RXvoNW6irr4Q\r\nWcZMuuZunurQEkUUTyOfsYMgSE0H6sfMN9LW7/FAQSF762NayYzx1yOtjxCf\r\nHQLGJ7519wJQMOQ7Js7RTCbpvSHxMREToGPvdj7R4tlii9kwOYYI9YARbYak\r\nLh2Q3FnC9HG4ynZjnPpwUCXyHty1B6hzP2kGgSz4eK5R8eeOmfygN/2R+vV2\r\nK2uPAFJXeEQ/5PF7bAGjzs1bjqFuQbFJxD6hOGPs3fw/gYjyqS4pqlTTzmUk\r\ngGlEdTe7Np9eGJMSTxyjMwryRsRU9ZkF2gODDIHC37HkYzl8haFcXgnUL6yd\r\nPqTyQ2AjBoFL7okpKJI1fcbYclYMKe02H7j3yMSIzuhvEStKjQhrS5tXxW3k\r\n1HdHCwNL+B7FEYeK+mUbj4y5y3GON6O2WsMcEqaqxGcAIN1wysGsqL+T3CxC\r\nKrFNwegpGi4ZZvmxWFL+OUb/OPO9EgI4Ok+3e/oGsNV4r3uMGOQY9QMKbp8B\r\nE/v/F2hDYo1H7zPG17BhduRK62v8LHoXL74AcyBX9ZZUznhj6a3UD0cycCLm\r\nustRmodCS3pKAGfQFHm0mPkBZurxiYApc2c=\r\n=9zp1\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-mysql_0.12.0-beta.4_1661077431407_0.7795487226249846"},"_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-mysql","version":"0.12.0-beta.5","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","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":"npm publish package.tgz --tag beta --git-checks false","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.5","_integrity":"sha512-iJzzAs+lqcPTXHnxtFyoGzqI2voYcaTG92a8DnRSpF4sLLdvymn2yrcOPs/kIBc8qd0uoOUOF+ELeHoTe7TGIw==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-iJzzAs+lqcPTXHnxtFyoGzqI2voYcaTG92a8DnRSpF4sLLdvymn2yrcOPs/kIBc8qd0uoOUOF+ELeHoTe7TGIw==","shasum":"256b0462cd8721ffe7212288cbb1cb33d9a27541","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.5.tgz","fileCount":118,"unpackedSize":187304,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDVYZUM0zO88Ese1jN6okle6+oBuTgDQst82bbuVbgsWwIhAPDiox0VSwruBSFNbENoE2ydh+8CjX01ZOHSw5zFErnK"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjA7qoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrjcxAAofirdxFknfqMoigMp1va4Dw9EGZjZ8Dm1nKAfdG7kx2LK19z\r\nGQzjslJalHKfvzrzq9b9Eg9nfmYVs+vE/RoAXaj+b9Sdahf6T3JXdmc/8o1q\r\nVaKTYLFiHQ6sX1qpQ3jqF9pzbt0bOvo/QArKuM/NJXAtcdj38pnkUV6WlGYI\r\ni+twIMAikENxCW7bI9QjsW3R9GXDpnHu7S+8WT5sBbw9i2Fr3S8ZwBbb7kFH\r\nWnAkU7ct1qgHx9f1mnxi4NLMIbNQwTk5iuFFQy9TBSOzvqkURKlMfiq2igia\r\nhdTbk1Q0U7wuQn/k4AqfLlcctL8tKngJp8d5eUIc8MfO/D+ZbCo9WDQ/hcal\r\nORl/lFvmqDWFPA+ZmguRsGZfaWBlk8RqMOCLmgB7kT9wPjdiOAWTis+hxb4L\r\nHmzytcuqZfnF+NUOAsHnYfUMbSKxXRemfAynUZK7dU1Ox9NXlwcNULsSF+wC\r\nD7oQgT2R+tk+ssFyz1p0zeKEsIymcnmj62tn5JnyNByn4SUhGPV35A7s6A9P\r\n0uL/5nUEJoHjf473Lpos6583zp/oTrHEceek5qn0Augw3XXoAzbPeIZmYOpP\r\nXJzC4TIw/KSx3xGfIFBYnQC1axOyR+m3+9/Gw/rHZ9xPdcxWUb+flKLgzpPZ\r\nSW/NOJ0pL/qzsw1Rk+XRzAUUkRJUPPa2zfo=\r\n=VO0U\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-mysql_0.12.0-beta.5_1661188775941_0.028165047727318093"},"_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-mysql","version":"0.12.0-beta.6","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","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":"npm publish package.tgz --tag beta --git-checks false","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.6","_integrity":"sha512-pRTVhpEP1Gg0t3lhn3GTdKPY91+EsIL3eaOUSTs2Q5axjR306q+isixIaIX3y6dhb8UUdowZIcPpTYNb28hyaQ==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-pRTVhpEP1Gg0t3lhn3GTdKPY91+EsIL3eaOUSTs2Q5axjR306q+isixIaIX3y6dhb8UUdowZIcPpTYNb28hyaQ==","shasum":"a12d813374cdd5623a80c843aeecbc6d53174e60","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.6.tgz","fileCount":118,"unpackedSize":187442,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYhzwXWyFvR7Y6fF1+AxtEz/5sSZSAb4x2j00XEsLscQIgNRKhniE5+SYxMKR9Z2+v8O2W/0okUZ2dQrqs3V6hHZA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjA7ycACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrFrRAAgNOTr26vQfBMMMSqV2m+c0Y2OziME2aZu1qm4F8S7VQd077V\r\nd5NlYiCw2vIgDdpQj1AGyEKTvllV6qotVIIQyN9iGS7tlS/iv6/bdONqjSAp\r\nwkb7K6VhilGQnwc/xDGHV5NHFDF1uXgqAZjMS1dGQPaC+98Oe1j1wixfrmPl\r\nL9c29A1qsfst9qzkknMXvgHOSNwYX3Wrwm1PnMV7njwyO4hiu2OYkDSOAB+Q\r\nPol6GVf/AD0NP+aRYXRsooV+/thjHVlgjOssQBUrA0yMtkv4oRmJKcoZlxa0\r\n5r5l6MOGIINBUSOG3wzE3k0a3K/Dx3PM+fMVC5Iknqo5TBHQMfWwAUSHgohZ\r\nQyV1ShvXIDm0zp2SHq7r9AXEUIm8faQEyWBSP24veZXFor4RH4FUkENcy4AF\r\nRPeEBvavu7FhPbqb9Fs7CULU/mxcx/gR4thKjaUKhFJdlwVGO0XpCrUlIwmS\r\nUAOOfzRFTn2gQmsVlwx5PkyYItDOVe0zC2wT1/AzjmqHGcMR1iVsTm8uez6j\r\nKW+6YclW1M1mhq6cUBlIDnEdYasZgrlmGjOZEpboOJnVpwvU5EjxZVDj6xjR\r\nokqchJVoQ3grN1cD5h5vKVzndcYyct8zDrzCCBzf0f88Ri44xZrMmcEFg9Vi\r\nWviWtQCChSm8SOkyDEPKCTCwHKthWpHWQZI=\r\n=h6hE\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-mysql_0.12.0-beta.6_1661189275782_0.24354754892275077"},"_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-mysql","version":"0.12.0-beta.7","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","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":"npm publish package.tgz --tag beta --git-checks false","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.7","_integrity":"sha512-kV3z2K9HrODyLmq+zaBYoROiL+3hA3/TZlAQBTsUU0ZAD21uTg232m4Kzl6ROaGREJP8PtRkdYHeSP96gEFlog==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-kV3z2K9HrODyLmq+zaBYoROiL+3hA3/TZlAQBTsUU0ZAD21uTg232m4Kzl6ROaGREJP8PtRkdYHeSP96gEFlog==","shasum":"3859cd6e80c58116b5068e317f53a2b0a9bd24b9","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.7.tgz","fileCount":118,"unpackedSize":187476,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDEtbgvbiyDUZFN733mZXEbiqcLWbn1Dn4ocOQXbiZk9gIgTnE2oxKu6GzIDDDo44JTPd+qxe96pltjNiKZ9kP1HDM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjA8GvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpCow//b1ZC/xGYx8la58LYehIiVFdhKtkRmBnJNkAtQVt3Bt9lwrrs\r\nNOYaMeq2A4CB3lP5eFgzrV65PvOc3pevVEaa9SFXu3sSzQHY261qnBYimg0r\r\nIypGn/FJW6Tu/yaWqC+FPjyFQPSTBUUpSdeR6fISkYEHI9ECbiQSxHhNq4WD\r\nIVItG3xVMO4Ib2j1ojQi05YIDBBFTcVlbJvD6Q7NtZKKi7fiJ2oa3bQhQxd8\r\nJnxig1HtxxH6mb0+6zn6KFi/PcgKUg+WMpyXiI3I6cjEFnnTKisV7U7iUdWz\r\nwTHcsX0qfutiBpqO4d8IybBx67JEKUoWFMUJva+04YjA/FIJZO1GutJOVogq\r\nuiD8t0T01LauCnQoTm57yCF0AR8PmTQqW2NnnwF+CxaTfw2bUR2F9clGMoIl\r\ne9zIN/vXxtBgK0ToIzY+tM/ekvgOFjOPGvwBtP2LHzMXom2Q77MXQ2pbE5Sl\r\nd6kvHepzvAlog1yDiV/eGF1hhHHcbb/sJzSEC8HyDafiI+irUAxq14Z4sdXa\r\n2B/WlXo1bGsKI44Ne3JgR3oMA6Lz0XgqmSF7h+QCDxWJrXqYl0qpLO2ETXT8\r\niGcn93gsb13u7t8VOHC3oG9uE0hFFZCfco+wN0HybGPQH28SBP4FwAvMY7+o\r\n6U9+sKF0qnizFCnaBeXuYf6VKIT98gYTfO0=\r\n=eFL0\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-mysql_0.12.0-beta.7_1661190575018_0.7448227345128493"},"_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-mysql","version":"0.12.0-beta.8","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","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":"npm publish package.tgz --tag beta --git-checks false","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.8","_integrity":"sha512-hMm7R6ZXjuCIQEx606ovmdNxrQ9F0N+pdMg58ICKVyOzKHHi8tIpNqwkKirTyIjseXv7u3qxT4Qg8g04f+ZVoA==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-hMm7R6ZXjuCIQEx606ovmdNxrQ9F0N+pdMg58ICKVyOzKHHi8tIpNqwkKirTyIjseXv7u3qxT4Qg8g04f+ZVoA==","shasum":"15c0d2a80a013c890087479fff644c4a7f87c024","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.8.tgz","fileCount":118,"unpackedSize":188800,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICsHCaXCz1TRdHMEjDYsjAs3iyKj5WnPEVWsTg/V/458AiB4cN9oqjRNOdGjw6qjHQLp6cvBALrKvJaVl55vH3CAgg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjBRcUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpL/g//efMWRjniztzX065PcTNNvY2EncG1+aeZpSHU+QN9BXGI/vbp\r\nx5oj/rshE3uxLYgccm9dPEhDtFaarRuMvl6GJ05Zq9pP9Eb+0eVXWzp7puh7\r\nAADmq7U22/e+hMuKPFLGcjtTqav2W6KuqT0NcowOhLTr7UmT5LPzqh1SwgY7\r\n1JQB7+jp87jA9IPCR1oird4xc5GJsvj6JZcf18rNf6McSBldRAjlrepEoxDw\r\nZScP2syXfl4qsSFoeieqIxNzgPugqH333YvsAyBztUndy4VstEjYA8wnyEZb\r\nXZ8EsgnTewn9f/jazLCkuK/cwgWsEkj+z4xC7hTbju5JhLTn/zGKlBx72HiN\r\n+fr0S5aXD6c0Ic9JCQLH5fsDAVxSoZbraCOFDXj17pbHGtoMV5jITtUIXAmn\r\nZWtzhaorbR4QSNmYf9CsqcvKwsIEatXww/VvIGm7PzUI70CyFrmZmPw2fJbq\r\nxK4Gsw5c1Kf+NV+7VCzIjIoIRWt4WT/umV9Um7qZnNwS3PxU7AroBAJAuBuM\r\n2ZHn7SHKtSLY9M2Iw+5nSjzXJg3EjnqPnePb5EvRUCK2zpjD4stbRLjha2N0\r\nbbtOShd4Y1S3BzKQ9e/1kSBfIkwLHBjmo5PRgHt1XV9bPaLxronaVwo25QRd\r\nXA/myw4doUeFDnQ7Gr4P732IdhD7JWw/IeA=\r\n=UPty\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-mysql_0.12.0-beta.8_1661277972293_0.3298338343878129"},"_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-mysql","version":"0.12.0-beta.9","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","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":"npm publish package.tgz --tag beta --git-checks false","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.9","_integrity":"sha512-j+vfAmgQpZDiCePaRRd0lDOtqp5R8DWi+h+eaatqireZeJDxw0EoTGUfix3itAhbVkUeYmbRBcYuw0IMm8jTpw==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-j+vfAmgQpZDiCePaRRd0lDOtqp5R8DWi+h+eaatqireZeJDxw0EoTGUfix3itAhbVkUeYmbRBcYuw0IMm8jTpw==","shasum":"374a9ae2a342830af83e5f9ed9472b07bff777c0","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.9.tgz","fileCount":118,"unpackedSize":188850,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDViDKn5CDH2xlhCq3ZEnJyAeqXIK6rMOjjrsnOcuuGOwIgdXT+cxdZcsGGQsmid1R1FuDTkrccb4EKQu5tJVipQww="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjBTpoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpUlw/+KZKZFjReFaTc7sLGbc+UEW9YOr2FyMN9a5vc8MO2D0Gm8WNH\r\nE27Y+wusEpx6Cffk2bBuIGbOEWm4ioH8xipEZ1f98V5Vya9Fdu77xafsSDVL\r\nKxFlMVuLoF0XxTCXWSd8Iu5MAboFybp78fu8MUD6tXqecFaCakx5g1nvrjM4\r\nKds9T5cHMw/tX94vdN4bFT1QyjwQrCIVDPqi4nEmJAmJBMn/eZ3s7XRJNVGV\r\nyfnRJNAdcH1PhQjZGSDSVTGPHmBUkNmorNda8RXMPGHX86lhRav+mjBwqgF5\r\nvwYK8cpVhOOC+jTiMlAJgDUeCyNHYZ/w0GO4QVVHggNTVBUYHe5xj8S8qKAd\r\nCf9HNIOugsFyQ5+N/rrmK05tW5/TLA6KRRMi+jFXKbT/6sljN3gX4Xq0wROI\r\ngoqMDXm8tVQlX+RDN//urCFC7i4ql0yI9CAX3xIWkkAhBCxwcYzp4FCHXVcw\r\nlS8LJTCWFQ53Ks+sp7jJpsxNesMtPXaa3uziNlQaUdJydt6dK9wEAlMkVzYZ\r\n4y6Nf5u8v8o14+q02suP1pOS16CTwqJv/NVDJKhUe4hXTM2DDH/0vjaq0M+1\r\nVWW9j+IY073lrsPgNyeeEm4hjW0yl7/SBKJpxBOXZIr8Phw4GmDipfGdPjje\r\nouDQ0sNufctzigqV94NpTu0NqroFbOkRxq4=\r\n=l52R\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-mysql_0.12.0-beta.9_1661287016097_0.09516282275566246"},"_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-mysql","version":"0.12.0-beta.10","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","type-fest":"^2.16.0","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":"npm publish package.tgz --tag beta --git-checks false","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.10","_integrity":"sha512-pzFzuNDL9dbxRT53Lzg8pDfslC8Z/IXIBYDFChMQoXa2ZKpiv9bKcxlDU2NanqYxKCiXbFbUPrNQdQPcqm0sZg==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-pzFzuNDL9dbxRT53Lzg8pDfslC8Z/IXIBYDFChMQoXa2ZKpiv9bKcxlDU2NanqYxKCiXbFbUPrNQdQPcqm0sZg==","shasum":"ddbbb1f87d75d345ada4e46a063d915cb716589f","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.10.tgz","fileCount":112,"unpackedSize":185560,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYUQCamIb60ooy6jIC2JIoob8xnS43h0rl3PfGaSqV8AIgG1GfYd4xOE/YMB7iQUoStv3O//s0/aEGLElRAS8lnTc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFfG/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpuHA/9HqYCgfA/NfUMBuw8YgXnLVey3kemwFFOWayDfP7k81IexCwi\r\npQEEomNQ37dM8KXCY92uNyo47s0Yo7/o5VaOVyFdb+Bs6pZqv1IB8AdQhyTl\r\nVhz5ZoujnKhRAUZlOQzzOHnK5++JHXe7E6eXwCn+qNVYNW/kYOTnpQd4rRuh\r\nYnCquCxkBhI+WjLMLmWx50LHgxiHg3xZFgRfX2kardea5HsfGPV/e2JrsWtr\r\nqufslWk8IY58V08l8OFMaf1LehYUObjfLV0oYCTiPkMe2N1SOF5Ys3xhOtgf\r\n1x1YlfPtiGXdf5rgz5b9lva4FDiX/0tZmUJmIAJmWXBzKSqCChX/IIZDrqRE\r\nFQnm4oc2XED9hT96m6Xx8oNA1pQ8JFcHOWdeSB/8P0Bf/R03/SST7DovLsHl\r\nur4I7QFv71/vk/6upBszUEJjS1RQ152ho55DyEs7fe/HGMXvt309ACXVNmgQ\r\nNSfcFDFIjQ0tPVqn/RHQbZs4yDDqtOTfa6zLQVFg7J8cTesdt9KXFx1WrXaL\r\n0D1iNBK4a2ZU6RRFIRQK9A3DCu0eydl6/GGaZvuZtDvHzD/cWVbCxqd0HftJ\r\nhGDyeGoYoT00o3wiEa0qGBIDTypcCHFCs9+gfY86XBrlvio6/WwcBn0CGxWP\r\nhSZVroeJexguww0cWnR7ngcrkzRgZEJx5hc=\r\n=QAzv\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.12.0-beta.10_1662382526966_0.5324380375125439"},"_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-mysql","version":"0.12.0-beta.12","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","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","release:beta":"pnpm version prerelease && pnpm build && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.12","_integrity":"sha512-zT8DVUOOyaX41u8o4oKVETMYImfDOc7PVIYmKoHAkj14PRClv86ngc5set30pfjd7hPl4NdvAuUSojFdWETV4w==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-zT8DVUOOyaX41u8o4oKVETMYImfDOc7PVIYmKoHAkj14PRClv86ngc5set30pfjd7hPl4NdvAuUSojFdWETV4w==","shasum":"6a15ffb6af07dac91d346ee2a7ca525f2636c9ce","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.12.tgz","fileCount":118,"unpackedSize":181876,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDKZlqeQHiLScH/UG43JDP/IBSAb9hmim4SS1wXWIoo/wIhAMsVIA4pB116sThDmYRl5SJ7bThmATL9oHlatzOoMvBP"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIGoGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq+EQ/8Cb1fjkPh4Yva5uJ+rJZuJ5r9//SusXrD6iqnUngxUPzJKTQV\r\n5Q3qQ/8FS8/tYQkr4s5H/aNHHL8c2+cJJtpsCyl7I2meycNYxOB6QnTo/ITN\r\nbxIVsMLIJVdNUXOGgsdM1HGxVz17leW3N2y/VsdQ/4+3aMr+mWpV7s2vsQRv\r\nobErGk0HclY/2HByQCxYUD483AatuthyxxIoJm81YjLOrdG6wphOcjMqPR5d\r\ncWum1W6flSnAJAUOZrXvD1nx0ZGvvrlsZeVTCicwA4zoJr1T0SjvvtjCTucP\r\np9nrVPDmgRf0JNsGCsG2UOTGSasHLoJVN4hHOHiupxY4fJuXUTWkMW62jnxR\r\ncfWhgGTfCROy64HPCw+AQR9rkdk6eHKtVreTeQn1KP8GAzgJ3SvCAlWI+9cf\r\nlhABZTv6CRMYzZ64Zr8f7qNzCQHPQNXrgAYPKB1LVcyhiWCEeuT2KAWCujR4\r\nRW7zfLPU0jqzATWVBD80zcU8V69OYcu58N4BcN79USt3kKv/aqLLMUOAHHzn\r\nRKn9dxIcmYHRQBG6jRtlxvUOI8skA8ebDlSJRt+SbCVyzipMIFXuhIhf1oLF\r\nd1Gp6yuulawL0ZIaprmTYXG6lN5OF50Dh2TCNrDvEUCJvt7oXGqRFmaOwuX6\r\nou6KW3NpG16yv98OzxadPG3wQYY8MFe7vCE=\r\n=rDd4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.12.0-beta.12_1663068678687_0.19958512538685946"},"_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-mysql","version":"0.12.0-beta.13","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","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","release:beta":"pnpm version prerelease && pnpm build && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.13","_integrity":"sha512-1XS1E0Sm6QgZXSTJNmF9MCOhRL8FI0PFbczucMEMzUNpCJFBY1sadW4LF8H4wR/HNzidfwfA6zzLnakImLdLsQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-1XS1E0Sm6QgZXSTJNmF9MCOhRL8FI0PFbczucMEMzUNpCJFBY1sadW4LF8H4wR/HNzidfwfA6zzLnakImLdLsQ==","shasum":"c1cf87365889bffc52a419cb37f86d96941b368c","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.13.tgz","fileCount":118,"unpackedSize":181977,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpNP2yg7wJ3WGAVtAZe/Nml+Qix6PSJTscMV5hKGHitQIhAK3gdL5+FnuEvvXGUgt8y3AvZDouiiICsLPQZ0BHF92I"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIHDnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpRbA//ZrwHxDIanfRe/WOjOq/LmenhwzNmDqAqJYkeZ+HVxa3EHbeE\r\nEue2c6KaGJUBH36rERwfaOYJKts/BBg9cqu3fqJpguIGPHoMnRSsOuf+eNeS\r\nvegzMQVjTnFtJvahbqpdlTeiVTmz0eM3UBZUtMN2WuSbc3Z+C4ihXQq3p086\r\no5RgluNcOGUXIZQpR5bAu3Mj+iuSBaD89RdAewFAQ5Y4Yxx8wxr9e7ocBPSb\r\n89AhzD7oUg4CsZWkui8mX2sZKjrbrg11pCL5e2NLsXKFzcasJNtOta32uc+C\r\nzaox91uwqMyNBCbtoXhubmLckn8D1gdtZ/FPA3dJQZAwrvt59F7TR81omiU2\r\nS/erCXMjdcOMGVioHG4rxvvzWIzWUHCP+oh70hEPbQxluNT4N46x4O+4/r3u\r\nHgxCNoLSHQjds7RBiOjdZ+Wy3IDyBye6euaHc02S2FuJQBylof6b2EDkcXhk\r\nizz1H/BSxTthY8kDj7/P1K0C9N9bU/q4GobrWXGxcd5b8ikLAz4u0aCf4W/f\r\nWgKRht2BkLsXvsY6H0OoO06azSoJKKzIZzchpkEY/ayG9u6X/tqGBihXEJiY\r\nXa4D+thsgetyZ3zbU/KjTbq15Bwcgt1Pdxtz5lMR6R58DtluGbZwMshIP6C5\r\nRzk33SGQ1ql0hwk2WgHOkBQW+YzbnzRdNGs=\r\n=E/1R\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.12.0-beta.13_1663070439455_0.1805979056701561"},"_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-mysql","version":"0.12.0-beta.14","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true},"drizzle-orm":{"optional":true}},"devDependencies":{"concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3","np":"^7.6.2","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","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","release:beta":"pnpm version prerelease && pnpm build && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-mysql@0.12.0-beta.14","_integrity":"sha512-f91xfWBHzq8EpW6ARwO4WzVRfzHKQ2yW9W/0srggiNqXp8MXmIfRaYGyThkisun5mtNvkQTYzniafgBPNC8Ujg==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-f91xfWBHzq8EpW6ARwO4WzVRfzHKQ2yW9W/0srggiNqXp8MXmIfRaYGyThkisun5mtNvkQTYzniafgBPNC8Ujg==","shasum":"0f22728503c9cec70cdf7dc252f9938e419e82a5","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.12.0-beta.14.tgz","fileCount":118,"unpackedSize":182884,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEBI0yIvCSEIiXPSli2tUTlahdY/xObtfi15Eue57imWAiEA7fIGDv57t/BVFEB4DcFucvdpeAXUSEAAExBscsBdGGQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIZSTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqa+Q//dHqVZa5/hlLVWHs0R4glNa4Lez/Fquikl+77aysqa6JYnpJ1\r\nuZ7f903FsO2onR0zpXQq8efXLA5AyBqx/5DKzT60+8TM1yiNnxdym8ZnfO/7\r\nFqNzsaMQrfv8QkxBMSZR1yI4mn2pXSqPXx/6g3bPaJ4BGArQe/DMNAB77zRO\r\ng8jQMUkKmbQaUtfNMfLc9UFwgza/LF4M4rBVtb62ViEzdhFBOGMcOL90e1zX\r\nJai0A2qnvS9pbLShk3ffLS1cPvI/TNtVVSr+OrcyQJH2sam6yUQdJmrdLiJe\r\n6gJ2jkAEg4mFsyiuER540pkRmZZKID64wOuFBx4eZ38Rmy96rcxVYlcwIHt1\r\nN8qxp9qYEs8NhMWex6nDRHIQLU2CMFNxZBj/gsQL5cE7rclLc4qc6HkFusvL\r\no4oiOddXXbmxBjeEED/u/tg2aHvOw0IArmsUvmUWhTmkdJbibYTl22h7nXYg\r\nlFXToRjHRDJUghRy+M7oty0zQB8IPN/SLna655hdBh3xpqraHcQaI+PWITIv\r\nYuJgY6a47PcLWRIVN62LSy12CWVBuZR8AU6xVtsVMr9TolwfBhTudGUf834H\r\npwAVyWUdXepweTvsiQ5oLtqd/UapQsa37VaRppKCH1Lv6yLakHI9vCNZU5PI\r\ndLHQcHgRumBkENDEgA2YxANrH4lPPzZtgjM=\r\n=ckbg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.12.0-beta.14_1663145106924_0.347589329671258"},"_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-mysql","version":"0.14.1-1c58471","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D @types/pg\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D @types/pg\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D @types/pg\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\n\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.1-1c58471","_integrity":"sha512-3wjbifqYVAEhy/dYbRtH4l7i2R1kPA27+6lBRzG+F1HeutvPL9gJj1/6Mbj2PyrOzKe4FxfRUP9Y25IETlCh3g==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-3wjbifqYVAEhy/dYbRtH4l7i2R1kPA27+6lBRzG+F1HeutvPL9gJj1/6Mbj2PyrOzKe4FxfRUP9Y25IETlCh3g==","shasum":"0dcb649412a42d0b607cf9e2f9ccc585b19b578d","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.1-1c58471.tgz","fileCount":147,"unpackedSize":220967,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCW2Ajmnc0ONDeygEboCxhfQyZFkLghB8wsefWLMo3/mgIhAKDWZ0Hk/GxBpx2L0eVwF/0vWy3FWpWFvMtrGfVjMPr4"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjm6B1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqdkBAAlLbZCeEYYZeyR0EngRY1j3/seDVf/llXXI1lIlhEn7gjGDZE\r\nqlEinOSVyydXGgsL+q/w9C53hNh3s/QQ2J0eLXGq5x9pMrMn5xZIfiEQddeD\r\nOiADRNhZYO97k2ZkXQmEI77pRILi7snKFmATN1cEqwot2xfhooxR72V7WiWf\r\nDi0V7D/oJyEB3tMp2PksyfSx/SuEe5aKCq2X1V/mOaRhlSZ7ko3tunDoo2kK\r\nTazVHkjY7QnMK7b0UnrbS3osMgyeR5858DS9aC6yNqoUL4KzVqt5krNyROX8\r\noh6WPH29Hqx3JvSGTd6BqAekcobg08ju41uOLIE26ZkjEkWkbwaiDB/lrY14\r\nAoUFOaDirAOQ1Gcs4KnZmAJ+xz6iclwqO4VCQn9O+8oWjxk2pWiKiQZjtLzQ\r\nq2u+bSwHb6PE4zYAvmp5F+MPSZXL91l8kbjmciWPp0pPvWZJxHryzjitcHXn\r\n0glplpof3sm1fBsfVfrUfzkldkAEpSKS3cxLw6cw7GwOs+pqzGLiimcOoUo+\r\npwR4tKMBwPZcpdlGPEJKnctzEpvgpb5adfycEYloRZBve8D5uEGd41LKh/ec\r\nNG+n4/Sr+eX+n1cWEgCuE21E4MXqwU5E77e5OTDLLASgo201HLBVqgHfDziv\r\n8t47gQFZFNT+/vK1QgcGe/ndUz5ayv585zg=\r\n=owx2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.1-1c58471_1671143541362_0.594600098591848"},"_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-mysql","version":"0.14.1-1d98f11","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\n\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.1-1d98f11","_integrity":"sha512-YlW4l+i1DzWcXkbO5DBT32FNz9crJKeT8/ReRg9d5lzf+l/NoK0AaCxKNTNddrkNRwW41FBw57zkyV8yPrI11w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-YlW4l+i1DzWcXkbO5DBT32FNz9crJKeT8/ReRg9d5lzf+l/NoK0AaCxKNTNddrkNRwW41FBw57zkyV8yPrI11w==","shasum":"72d4e9e3314024404957578fb4709e979d4dacca","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.1-1d98f11.tgz","fileCount":147,"unpackedSize":220904,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHmY6SmI1iYiUXC6GaPh4+6CgME7y0u0RmvYlvTHTJQ8AiANdjQBDLrV4se5HfF9X/yuyI02ZgxWZ9fhfX8SYYysuw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjm6DcACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrT1BAAjIMHIbkBFcLSSny/xAq08799qAtOttZqL7MJGu+MrFgQju6O\r\nSzUTjrQ4CwTBEfyHhnm9YNE4BEn0sxwMLJ0EbejgapsYyd2jQokzsE0AUTL0\r\n4c+734jeUo+ySHomQgaVZtocevnHgey8sNX5mruML0c3Idet2mHegveYZGJd\r\nd9GmFUx+oX9dhbO8xeZM7XCn78n4Wb4RNongh2jgJfkJQ6+eqGaMKP85zoa+\r\nvKdNM1NO/tWRkwvMZe/PaMdSoItGkFIB2jsWNmSmfzwsQrZ8r7VNPJUv26XO\r\nKXHmc1r881UecRbURUoIEbwGOAsnQ5tU1mFtwUxzImnUPUnDWGhhdV/DqluQ\r\nlfeWxtZk3f/BSmfCFZ/zj6a7sWCFbzNUQU92ikszGyqsy57QGNCpifPOnDHQ\r\ndrNINxAVUiPjZ4P/uhaXr11OtysVLd3ORbQIw8+So3BMjJrLVuAQXb7dekcz\r\n+9I+LFVZ32PrBfICi4srSJ8Ss18RkyPrA21kYHWTxkKOUG0+zbYbJn7l7HkR\r\niMDNRsWJNmJ7fDY/teLsXaNnBt5G5Cfi8y5tsHmdKh5DSys1j2HNQLEw/lXl\r\nadi4pmJpd8MFFRfiWIn6muCmB8mnFkXPYabtPMrOx4ogX3InuWlPGRygc3vq\r\ntXeNaAZi6LxqEYMEzWJkMLp51XV43k/Z5xU=\r\n=C3uU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.1-1d98f11_1671143643957_0.6693849839802855"},"_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-mysql","version":"0.14.1-f617bb6","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\n\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.1-f617bb6","_integrity":"sha512-KRVKR/ZUX1N6O0/J2xRCPU5MT1zxhkVjyskpai3nmMmv2qlHl6N+6sPraME+bJ/NxevXUiLxFsJ3YTHy5eN30Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-KRVKR/ZUX1N6O0/J2xRCPU5MT1zxhkVjyskpai3nmMmv2qlHl6N+6sPraME+bJ/NxevXUiLxFsJ3YTHy5eN30Q==","shasum":"f0569ea45f884ec2db272f7aaadd44ada261c0ce","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.1-f617bb6.tgz","fileCount":147,"unpackedSize":220886,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD6gUTqCYy7y0eRHdxxwMShg2NAer/tY++O0s9Eu3e4pwIhALyQVS88inzmMojd5bgLKu18JQ5MY0r2RApZ32LrN5DL"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnExqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmroEA/9GRx/90dcg7MkfPRLhZl+fyT1IUFGC5kmBtr7Hh2/TJiS2ivF\r\n7JRUt2C8pIUmHzuct7hs0VsZSTBsSJ9m3RxFQ4sp4K+TqEwMHaT4Wa560hVk\r\nJHksIebTY7x9qF/PIR2dve+j/0BC/CbcDH8q6idZLVf2ECv0NaCGxhU3FkRq\r\nMJeiNz2bdRa/hbNH9fvfw2Qra9RsbXi3pbTRCxZFNadRODGTC7fhE9EQfO66\r\nF1R3yPuV8hoDRy9BfcFVUOgqyX9rkpP5fcIy9BcAhy4+xDIXuT8Gt7tMBzcp\r\nxm4NmkEH7sqnnRvgM5qELLlfU1uVdtrpy6Y2X+lq0BZUJxXOaEU+S1Q1JE7G\r\nctyJyeR95raJw+kGFHSJG4m55175W4KmOZU1yTehLbp6XNXT7/vkarhXt8SZ\r\nLig/fwWKoMq/R5v+58bxVc75CwFd7CuzMpNKpEkKBqhIditaRylBEiSbyq1n\r\nna4BwOjEf0UeeBRPW9/DR6IVIHDCqgqN4k4MQd5ejRUyRCWn92DfLlTh+jSk\r\nBNn/DXiE4mTpkML7NB+tu05b3ZeFEzV1X/5S9XqEt8dGPpMOrznC9KCf5ebb\r\nBZ+LrCbzhJI7wNWyfhL6KXvbMlORvXkNRxfL5Gg1qQ0IoGfL+XQJKqM/+TVP\r\n0Vbi2qL/I2ZfPPxjEKSRboDt3mVL5XimSXg=\r\n=l5jP\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.1-f617bb6_1671187562784_0.49759286022680493"},"_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-mysql","version":"0.14.1-c5dca58","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\n\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.1-c5dca58","_integrity":"sha512-rcibiJ8RSWti4XF74QTS6c26eSZSjTDDSnxaAY8gduMMYXXti0Q6fWrpN+s7hRITBykygm/Td4x4bT2jas7vTQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-rcibiJ8RSWti4XF74QTS6c26eSZSjTDDSnxaAY8gduMMYXXti0Q6fWrpN+s7hRITBykygm/Td4x4bT2jas7vTQ==","shasum":"1acce5da9ec6574ca3e9a5b6f92de9329fe0e63b","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.1-c5dca58.tgz","fileCount":147,"unpackedSize":220886,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCHwyHwmhBvHTO74oeMc3670NnrF6zkHxQWqSWyAU8xZQIgDJ97a+QYBadDeyx+vnyUjex7oRC2cft9oyNKEShp5q4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnE/DACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqbUw/+O6igb5U9nLja0sC2YjydgbliBMS318dGXfhFIUM45TFmPZ05\r\nJgsYNkth5SrHUqzCJgFaDFLQ63RKgI3WD72YbDN/yh7vdoBn9i4+O9OMEdQ+\r\nq4+m6TWkeoFjLB4cKbC0QrvSemjJtEDFL4sqfw2D4UVLpv5AIihn37FYveQ9\r\npf07mCYT/Hk+fCmTIAu8KST3t0XB9A+GZWvUfCDirjJXmdqiLulqQbAh/coH\r\nfoT4oieqJrMgnx6h4h6zsmO3hqyL0zqvM4o7YlwLPLCnelno/BuzC3P/ptWP\r\nyyhJP2bymrsPuBJlLYeHaoxpNt/hpMdMHm6ByNxRqvNvay95ETil/zvXromM\r\n23cOYf77mDLfYqjEIG51S/zUtEnYXZ9UIlDNdErV7SjY/VxJ2m2z///qjI5C\r\ntmuJoDLFMxwm0VTfpVS5nvkP/MzEYSkKAOLapuillT/+IGJwc/O84V4Hb0Pf\r\nroPBrUYxo0qEEjXjW3iszdwyTaYsjV6snccCp8dEFy7j7ZVp00wa9v1BVRyo\r\ng/QoJqIUXid8Hyn1ZJ9Czjtp3pDguCx8HRLtXugDDperUGqMUWcXvH31IfmE\r\nBmM0VkRNMpS0Kwq5hqKykcQPa2vRFUNIPoQOJ6crV4P5pjvG6gb3lF3qof4f\r\nlgDowCwVAbW2cfQTW5bzhZzG7cVOC5bNjhk=\r\n=NbjA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.1-c5dca58_1671188419026_0.12641445155376418"},"_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-mysql","version":"0.14.2-3793d78","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-3793d78","_integrity":"sha512-1n2wWNUwjVOZQVjMuxP5xAcHn6uFbPP6JG353vbqbWSKnqMdvZQYS1X0IEBnJeqgAAKhU+VLEc29K4zqz/bAaA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-1n2wWNUwjVOZQVjMuxP5xAcHn6uFbPP6JG353vbqbWSKnqMdvZQYS1X0IEBnJeqgAAKhU+VLEc29K4zqz/bAaA==","shasum":"44fcbb1f53c5ccb21905033123348311d22ab740","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-3793d78.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsBAkmKpIhvmxwnHY+h/hM/oLt1o7lYIl4XdqvTsRtSQIgKzKp2TwcpsL3UeL7P9kzhfnVVPZFAVp1F0JhMJncMaU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnFOXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo24Q//eI4IDnMgFx99XgIhSW0j3T4fcmIZl4WrQh2Rc7mgU56Kz7Uz\r\nPLvONUGYoA0VJ4xAaln066YYtxAg+izpXtQ2kNiAA5pXgoT4SLWAQnJwJowD\r\n3N2T6sl+AV8mwOBMTTI5VzOJRyN4PuAM/pyf1+BsmwZHfdgk8VXwZM4+ucMf\r\nSv8EPnZ1AyakSMraZq8CHvB+NZA37n1DHTMZ7YGQXI3m5iSgSrGmyJadftwY\r\nabDpJ2kxAfaca6P1XvqV2/9QWfC5M6tSk1rzvHd0RhswvyCamkOB4KZ5FJQs\r\nkMz38AHlGQSi5J1ZKPT3M4+FxxopqrWTDD+A1+wSjd9TTMAmKau0lIoew/jR\r\n8GYPOP77WgiUVtPDtLsl90JFxqnAD9sVMfFftF+5rs2/rfhOhe28QIU793P2\r\n8TpxzjPgMqLRZgqKvl8GBwHfHyRI8hzvacLTfeqCpaoaj27EvrcOp+zVQMQT\r\nrd+67y29lKPnJQb/iXRYtEypTPI6Ghw4yBnCP+/0h+Ltggu+l97wVUVqEn+P\r\nHYmcrPc/6d8lOfllFUqScIhg+m3TgvzxVmqbvpdOCJqzlDCoMtKm9LkmHRPu\r\nBXmTR2KQGfunSgEoeNXwWb1vo668aL9G2237pHpo3EbQdPte++3N7Gu/LZXR\r\n5qHfQNSU+X8PHstrBBJFD/s6buT4JavAXYE=\r\n=uMSh\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-3793d78_1671189399445_0.8987691143897147"},"_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-mysql","version":"0.14.2-3967f06","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-3967f06","_integrity":"sha512-e3PnQg5mlZ/plac6LadnlBOVvEnM6DLoucEe/wTUZmbG0kA8pIsBSmSVpzUDHqZ33VsMYHbTR/FNKXZk35tzYw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-e3PnQg5mlZ/plac6LadnlBOVvEnM6DLoucEe/wTUZmbG0kA8pIsBSmSVpzUDHqZ33VsMYHbTR/FNKXZk35tzYw==","shasum":"145d1224d40108d0ba1d53483777f74d42b0ae61","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-3967f06.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDer620MI3miRXauPC7/SipjJdDRG+2yn6bT3M/Mp0FCgIgHNIZtY8ljIpspwt38JKP870zZslCQDL5Af4Vbhy3qvA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnFTjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpGxQ/9EdGpWXNBsyQ12hXY6T4siAlhlOzp3ETQ9yN2I3ZW6u8BxP/8\r\nSMOUhbYdqgXSgack0r8mmb2vE/5HbBoAWPH2RYgOgzEFlJ2lJE+9CmYgQnpn\r\nWu3/DA8IpOeTc77/Q+mq+oyTcqTQNLeVpth0SCT29lCgXor1QyBTznVU/vRB\r\nPO/aUXcn++YmyrBF38cUpiJhp3gXPcLIBn7vf564ei5p8Y8EgfKziWsyl+YO\r\ndZjp3+UsM/ju5cuzmAQB+vUPMw8uHJlmfAQCFIVMzB5eW5/XyaQ+cwhuq6DW\r\nkd3OUUjAF98B1e/uyOw1oJYK9/OYT8/At5sPrVNDHyhaxfhcBVBhoSgRKgVf\r\nG+2Y0DRjbx34fTV8cRbx192XXYJghIvKNaQrqlLQEzxq8rsCVeLOPkt91TXx\r\nW8nOCurI1JAcWBMRIIxrBP6vWS7nJo0DAeidyJxfw7VgGbdO0YGS4qpDvR6T\r\ngRvsiTfFq4t1E0old9MgmHZd6weXifz2rD5weM2Zb3MIKSJu/OGUA0eIslSO\r\n/PnsuSAJPELez6mUmHZZ22h9nD4/svmBTA+E3ofP3m1Nh5jf3XDpI+2PhH3H\r\n0hUdLCMuinkLwt43Zi1bNyi+W3vJ4elkxkUQo5ixElERzmXvOsFW6acrgkT1\r\nGGNid/FHnPl4NqbFi1TEk8OpBY1XVweBNfI=\r\n=7UE9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-3967f06_1671189731169_0.5150432032954502"},"_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-mysql","version":"0.14.2","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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-mysql@0.14.2","_integrity":"sha512-vRvs46aRgvqqaAnGhF3PG4T8cWNt7s4Gu43Vo0DL+l/hxS2MXb/RrhB1gF2cwOOXSe7VQvuLI2MGv2sUO4TqTA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-vRvs46aRgvqqaAnGhF3PG4T8cWNt7s4Gu43Vo0DL+l/hxS2MXb/RrhB1gF2cwOOXSe7VQvuLI2MGv2sUO4TqTA==","shasum":"3c3e57dc2504bafbde0e4d125362621ede16e7bd","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2.tgz","fileCount":147,"unpackedSize":221209,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2m9H++aX1FQEyUja52+yOiQolmVy9ElSNxV1RJIr/KgIgactKf/6eNp2OTNA2ClDIAFK5keEq/aC8D2YI2+6hBns="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnFT6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrD6g/+LVjV9LvFa4yugsnJOe3qIBFsalEhEp712P80JzOVuwYtBjp7\r\nLMpHMiARuHcxZCF/8lGzoPsSBBcXuPm76UvwV+GXa3/8VW299MNTRGOngnHT\r\npyGWcoFJFOHwGnvxatY6zeV+0exiAg+Wm5/5dOtELphhEZ3nKcPPGtbn1gyp\r\nvdC4RpGAehpE7qiWmaO352GFKWQG2oLOE2/nJhZG7rbkHgWVIZtPcg5molr0\r\nN9KhIq8bf+uKbyXPKir2SGEkIM66qr9JocLRffzKm1Dw8qrGZjoY6SBxQZo5\r\n4zskJkPZ3HUmbzYP6ecWCDWuVfi5QnJ+9+YcRFC3rjqpHGb3deKatuZuH1LV\r\nq8fRPZ9p2eNFThxcWtAU/OkhmnavUFgBNGhqjc4RXJ06UDQ+stwR088PAZjR\r\nTicPpdVeBEcn9HjfdXfOOM6fyo2ZS/keVDDDSYgG2T0OJ41F0ht1+1CzptwT\r\n4M2WYGVkeqVCCwjX1Dusaf7sV0Fr3EcqGhylu303zhwjxhwwWaHZGiT6O4se\r\nHENiTYyehg0trXQR4yshvm2Rw3PaP91D4GVKVgxm3q1auMa63ZA+o+iRoRp6\r\ncHs+CcKyzbBVg8F3wMG3D3TBEWgBcEfTGhiagUIP7LIFuuOlS4ovfJlczfgB\r\nojUzQVXS9mUsx8aOoEEVQ8fSZE5io0jPAtc=\r\n=zeVG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2_1671189754751_0.1297914231498396"},"_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-mysql","version":"0.14.2-e902ba8","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-e902ba8","_integrity":"sha512-pWyCMke9XBIpTuHTiA6EJPstQ0h3P8Luo9lNHLy9wNWvloFF8fSLkEW35383S1cqA5uvBMe5PDyDzgxL56X8zQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-pWyCMke9XBIpTuHTiA6EJPstQ0h3P8Luo9lNHLy9wNWvloFF8fSLkEW35383S1cqA5uvBMe5PDyDzgxL56X8zQ==","shasum":"104de49573fb71617573da6a5bc7de9e378cbcd6","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-e902ba8.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHqmOZuoIEZE152mA2EAaYtW+9fdNMqF7cv3Vyq3JBGIAiBZdUMLL/3GoA+GCE5HPHVaZ69Iv6Mf0ZvdPTroPaRJuQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnHIbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrIVA/+LNzlorJRxgPRNDuK/OH2jYaxTORK5v3DDsswOfETjGfFhJ88\r\nYIY+eayOdM+lJYyyUS/PBJMjXAsoJiGm06ljl+0Phx5g5rWqUQBzlGX06n5r\r\n+gEN6FmeXuVM7JqoX89QQaJcX8T84dxtivbACWCV2u/D37E7Co/TlCgR3D7+\r\nJ1z2638b56NlPW3vEUe8NtJUeHfxEwmf1WX4OzyKbcVAFwL2FDYyh56ZUJkG\r\nYqVMAqSr8BdWADcV9fOO51587M8R87wdrXRfeh0ZiJvUMeMSlOoDBHXOfq0F\r\nZ8pGq88LUuX1uX4jOPhDhGb2OupHReciHy30hqe2A1DvqPy55sA7qyJ+Gywe\r\nAru0+BBVBUI8kdqGRZO9YeY1s5P3+Diw0CBM9FiCdMpkHGsa+kHCGfgsX2Bv\r\njkdSModirNwrvHCAuKTJbJhKaE/wUoBzzv7Lnmqncse5h/P078DpGwcIxcjX\r\nY2/1DrgKZaIqO5boctWZWHTjnr/Dl0TCjBOOQariKv/sOM6kdEdMLhKOyc47\r\n2CD5RsflNRYAYyhFS2tXJV63sj2OVNrNVXAty+tmwDAp/xPFtXnTCXuZJLZg\r\nKBJ8dBEKRGC7qStQ9raecYQRmTgMOcDgMInsFU7f9MbLNZW2W9yQydq1vb1v\r\nRKzbRVKiGB8M8UBmCzD630FWVcEqlRNCL/A=\r\n=PpG3\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-e902ba8_1671197211696_0.8258257955879476"},"_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-mysql","version":"0.14.2-a52eacc","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-a52eacc","_integrity":"sha512-PgBSMhxsOIadjtX0wrLZSnNhFNwsQCtLRL36ZJCcnk24AebgEGbiSJJSLxHOIfSSfQRhPuZfiBqbX8MO6HLGdg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-PgBSMhxsOIadjtX0wrLZSnNhFNwsQCtLRL36ZJCcnk24AebgEGbiSJJSLxHOIfSSfQRhPuZfiBqbX8MO6HLGdg==","shasum":"e91fbc4fa16cca891f6306efde8fc8ddf0fe536d","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-a52eacc.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCBIGpDilnL5M931xX5olcI6wJuMXA2HvAHNpPLoMcAyQIhAP1EC/RnQU81KJfF3OXAspzWPos65eFXX0qmMLd3P7Hy"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoKLvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp1dA//U1dLXIOBhR8U8Ap4DmbQ/lJDs2mE3LOEIiKzxxct2XVhRrHS\r\nltfaYAL8LZXoskjxnLEdEzFDdCNSBOIfIDBXvsurdM0HV+kaRoZFbAN63fnQ\r\n94CHV0hZAJ+h80++jg2Vfip+8RnMuWQSUAhG0h6zELABs4Czyi9Lc9UvaZeo\r\nCly4l5UXDjP/EFjgkr+zq9rwuTyb/M2sFbR9UDdq693DRSq7mn+lNggh4I6B\r\n7BgIgT8mOlelkBCNP4fmcs13SDAQWRT2OELVVY6ru08VKJxRw8H0sHtdEVHr\r\n9/MyAimXL9vO/Py4LAa3wJGEpow/hEUI2MYSq6dmGBYc4we8t/5Sg6lHf/E0\r\nqYKFkyU9UCDQYM5hqComIlyLkidtinLIjY/Fdv7WS2Uu0xRNOQxWWUq/SENd\r\n5+I8SviF2+evrqCKy752/Td9n5dH29mDyX1bDlpxGMRWJ3D270PNF2PN0Y49\r\niu1QG/U95x7u50i6VT7uQBZw6X1+ww3o3OYhaCK/UHxOCMAyMs7l6rmT9E3l\r\n9JdiOfoNgsaB5cMcYItVB5lm8jd+46GldUAIv4YD9QE3pPdcyoHiTs32dOqr\r\ncu/J73M7lv5rQbJUuyC3sMRq/E43ATWOeMM7ECG4DojFUW2zzUDwIv6TsKKs\r\nLmHuM6ml1C13b+sjROeD2y7wbh4qPZeb0lQ=\r\n=MMRG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-a52eacc_1671471855636_0.32337560449756286"},"_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-mysql","version":"0.14.2-5514014","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dw/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-5514014","_integrity":"sha512-qb8bQs8mAHEuwfXCieeVTYS1pG8cIlrF5AWt3AmN+2LE1cbKWG2kzFoxWcU+rt+lInCGfzPuYUkEI1ezbspyHg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-qb8bQs8mAHEuwfXCieeVTYS1pG8cIlrF5AWt3AmN+2LE1cbKWG2kzFoxWcU+rt+lInCGfzPuYUkEI1ezbspyHg==","shasum":"d1c67b34e615d6f92452bf49c84a96da6a04773a","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-5514014.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDm0I/HK1MbAMOoeHTMnnwF6nEOaqmPjTOzQSoXaeOIwAIgT99Hl7FUjQDd4IfXZF0I4zo5qkbuO0G/XsJy4SdscTM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoKMuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrMxA//eOhhSr2xO/1PlPOI36mLMHvLPprsyBgqbCXsPFj9W6Twnyi7\r\nKBojaGdTX+Wa0M4pyTcfKbrPWGGJ5r0rp8REo6vHAFP/HZ+k27cQ5kzwDtL2\r\nu+5ATIbUnoF45v4L4jX66eRGU3Z96iO328b3RNeFxe4jLNBP5MG55oKeykNx\r\n6wj8HR0PDJ9oiAMw7Uemlw/Kk+6ng4QDWSBzIToahn202mDzonu/yfh9lrE2\r\nS5Z0Uqv/C0QapTX4+vYeJx5vdZQjLRjOdmJAeoO7719gm+l4cAeoOTQ6XBgN\r\n1DAbebfOWGQkiSFRbotoai/BD5vUEpYsV/08qrC3eOPTfTtQ78IWnOHTn2EL\r\n0syVT1Nng/bVYLPv9KbVS89IYUbucye5gdsMu6vb1sXj+/7zUkmALjXyySCl\r\nKMTZC9qMBWQ+rVoCGyUgjqI2/TFRW4I0QpF4oe7al6MjUYawP6FhmHqjgVrA\r\n4Rja/R/kKB2k+nMJbwLp2UkCsYgtluPXi2YCncODQz+CM7hDNVDAL+ee1vdH\r\nuWN27JW7W2cdoqzTcxRVlYyEsgaK0DeWKbXUb7+RuylfjLNprWj0S+ZNifdk\r\nTrD2hz9fABVrpAAeoGFtpA4sRdx9enfWdhHz3n2Rybos37vmS4Xi+psWKAwd\r\n2sxiEDf3qOHySUPURE0gpYfga6Zq5HSwLtk=\r\n=q7SJ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-5514014_1671471917870_0.49629184202001664"},"_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-mysql","version":"0.14.2-cc06fec","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-cc06fec","_integrity":"sha512-SFiSX/YbOuHhrmLAvlyngeGxNyyftlAfnmdqM2OopYMIupudTZtf+22bY7qAjqrAOmqaL6vrOs7vZXzZkc4M/A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-SFiSX/YbOuHhrmLAvlyngeGxNyyftlAfnmdqM2OopYMIupudTZtf+22bY7qAjqrAOmqaL6vrOs7vZXzZkc4M/A==","shasum":"fdef760f2f08c6b160aa7ff454ee58fc801b62cf","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-cc06fec.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAeAZVILHkeaQow3l62Ww5/aMDl0ye7cPX4uQf9KuAEuAiAi09aHwvwaU0qF8slg6raO+Ttvz0bs4iHBlSAdrtUEmA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoKNYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo5Ng/9Fxq/o/HN+G/KgvX7MBPDo1sekLdpVkhs1yxUthly4orlbTLa\r\nCxnZRTVkcEfvcgW+3auHgsrabIluaY9OEsCxiQTRoMGBjsTWAkYaVQHgIDn/\r\njR7cZL4bk2o14HZyFGrvuFfo0fwKCwWtMRYox0Lpa3xZx6I03qNlW/mYvDg6\r\nUMrJq/rkMbBsEpC3u1pvGeiX4koGCSppsKIRMQqgN1JrLUBT01X8ysFma+s3\r\nvVGeEyrRxtJRIPq3fh7JlPhkyXoitew48fKsHaVPgShzZMfjO6KO3MQbsBbH\r\n07jN66hhOAIcrMIKoWLdytEw7VUB1BWM1k+76F0Ljq9qYE5lpN23YTPGgQYC\r\nlDMwZF09RZoZ2eQgg9DHSaGyPGYZOQNssT2JQcY+m9Dl/CTkMQ7PdYnddVE5\r\niW3BWDzHKOqcPoYJSoAr7+0nXfLMBIhFnej0W1jb7mDGz3yZnkL52X441MbV\r\neCeIfveNduicO+mWfDYaTXR6mQs3MdjGxVeLuBx+OsqTU9FC7jG8KU2v6uZI\r\nlC8OZfgIxYeugkaXBfa+Mu2WBLLErEjPSJGVXCNOwkJ/7rAXAtYv5SfMMcCk\r\np/o5ELCntNO0IeEzdyRK/UU6xgGC1ML/Ln+b78PryqESv5DNsv5Q55j2gdjD\r\nD/M1am/7afj/TnTHySOl2pyFllBTXQbbx3I=\r\n=jiwg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-cc06fec_1671471959858_0.6088308232377786"},"_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-mysql","version":"0.14.2-c7344a5","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-c7344a5","_integrity":"sha512-ROW2LS3ooxl4b6A/DJ+xXwuNzsWYzpdRq3a6lYrUM9//JW5lExoCmMDyDvdBuJbM63bUF80xZTAACwHrmieyaw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ROW2LS3ooxl4b6A/DJ+xXwuNzsWYzpdRq3a6lYrUM9//JW5lExoCmMDyDvdBuJbM63bUF80xZTAACwHrmieyaw==","shasum":"d7a019322fb3f3220c1bf724059cf51d9073f491","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-c7344a5.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2V7GLCLmjGpOd9fdSmrNaLrCGrc/aS8G99bbHVJVaIgIgOtH2ElQdvT0B9e/M/MhE4l5QM70gLMW5vVu6sRkQFl0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoKOJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq+/Q/9Hhet6H86Rhayj3QqvOSAOe8sm0eCCASbiTUec1uUVw+fcUBZ\r\nqGKg6HS8a8Stw7U5cEMOZC6jrQ+CtELGCNbGWoNsPJAu2g6zjskIIBvy4CrX\r\n7WImZ5eFqjie3uCz5HVP488jvHdHfUSQpkW4aCOtb+kJQUtVv+QVKv9M4Kzj\r\n0NQsk7mLYhpU8+uWrGj5FesWFHl03I6yqkoPS/O4X7ChwMAe7OhIUi6NqoMQ\r\nLKhsOBXGvR0o1GODaFKtlB/LfCZcCAQC4s5yewhfZG1ziYgLnhLdterhdd74\r\nHUgjO0n6yglNEeQ67zuNroGfpXIgO78tAhDzWypN4gnOzDmR2IV6x6Jsx94y\r\nqZGW772IfmJ2fTbBj4SZ+PzoiTSXjbS3H5lNEe13oGNGz2HXLPZazXF3kAxs\r\nxPOkQ3MboWZRMMm1NQOZVPKgEwk3ReMPOx3KP6F/D6+ARqPxsH574ExdNesZ\r\nO22F84fMCcfQKdgBHuTN+PTiUZQn3d+2nFXgBDeFx1DmDVXyw+x0uzGPRruh\r\ndOkYjFzjjLxw8mU22M3DB97zKNdSlpg7aP6gcmqiOdlXiOv+SqqlJpHRBwQV\r\nGq9lhhTfRFv8j3cWjku4OMvJ5t/Dvf22UcGpLxgV37vtIy19/AGfvHplulxh\r\nHQsp0Qd8wSIlUyob1LCCVwA5yp+6MrXklzE=\r\n=dNcS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-c7344a5_1671472008815_0.8741982202364174"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-01c3d82":{"name":"drizzle-orm-mysql","version":"0.14.2-01c3d82","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-01c3d82","_integrity":"sha512-spk1bGvvClflvIbrJ+C0Gp2t57iMt2z0GiUGf+wX5rOZEzA6pyBXePV9D5/kn3tApX3FRqdue5KB9PY+eJzwVw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-spk1bGvvClflvIbrJ+C0Gp2t57iMt2z0GiUGf+wX5rOZEzA6pyBXePV9D5/kn3tApX3FRqdue5KB9PY+eJzwVw==","shasum":"d4d03353bf670acc0b7400fd522199a6700c70cd","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-01c3d82.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCaC1PNR3EuGDJUzgEY5MCqwlTiyBs1IZ5o5A1g8k7j8wIhAM1dCaEowvJ6cZLJu+LU9ZyfyXLTjOtDx1iSxxMOMEnp"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjofydACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr9CxAAoCsTqydoeu9Fak7W2IJdSvpg3IuBtkjXnkBAG2CMc+ZSdBzy\r\nvMgn+4GS5EwrC/sh6ldBoDSZALLTVLR7eFsd+uOAk+pzo5P4uy8DFPp+45BS\r\nqMaXBMqz7WMjlZuQH1fpl+fWNoe+KvSJDTW7SF3fa/gpxK9wEfj+Y5RnP8nW\r\nfgV7a5/R6QnHdbykIudOUunXuRGZaMtbdmsgxteUo3xWUBWP3owzUbIOSBTi\r\nFHC9BOjUW2OR1xl2Tjtq2f8fFoKNqU+SWxmyTKS8jtC2y+Rxj8Y5SxntKc8I\r\nbn6TCS/jk4Hofn2UlODom62708pCslL6+2t2BHYV2MzGhA2Z317rUbo+tmCS\r\nNOhd23DD45rNr2jAa5wn3xeTy3F2zhcY7yN3N3N/TWFS6ihfKIkalyD1kJAn\r\nbRlecfPPZNZcEu3XI73gImBPog1mnuuimIYEYcf9Z2EW8WYpa6cq4UujYTeP\r\nTpIvfRWVNmyPFmaNctVe1nRESQAJgKb7AyAFy1YqI1Y0URDMUM3ZGO6I5Wlj\r\nbnsXSKykGEu2Hcw0zy7Mnxal1NgkxGz5/Yhf7Ofivw59Y6UWqfett3EDZ5xj\r\nNUa+s4DaeUsxy1MTi3GotOr5vquaT2d717P1BcHJug/inDwwMOtO6m1SJSeN\r\nwhjKp6rtCQfuW6+N1o6F5PTkdD+jU49502o=\r\n=dMgu\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-01c3d82_1671560349207_0.7793712791523397"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-4eada6d":{"name":"drizzle-orm-mysql","version":"0.14.2-4eada6d","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-4eada6d","_integrity":"sha512-bdsB7AWvEZDDai23D5TVSInz19At1iDhQrkccaBXDfjMheArNNHchYNyFsgT4qbbOZI0r5sQ8WH/9KsZ/P2ytA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-bdsB7AWvEZDDai23D5TVSInz19At1iDhQrkccaBXDfjMheArNNHchYNyFsgT4qbbOZI0r5sQ8WH/9KsZ/P2ytA==","shasum":"633fb4e13989ad08d7577c76f1c76aacc24bedaa","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-4eada6d.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICSwJnIo9b8iMPTJU3hyCxTg/6DiWWFUVvtukO8CSPFGAiAk72QNXrL9y83CH3suIeV4joOt8gjwb3SNhFbzuJHPJg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0eHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoB5g/8Cpwu7k+4JDKL3t/g/AXlsdZyCCZQdeakJ6kLug6W8/0h5k6U\r\n76ngX8iQb7ZuJKQsxcEn6zgfCicV7Whcsgp34np5Hcl+3Ow55LlgEY5RaAWJ\r\nvVbIhhQBWLuCF0K7Pw9s0bqsWY77cUflaJ/XTz3WtgUAVRluGSGoKPNcBjYF\r\nI6svCibXOhDiEXPvfo9WNsmaP54+tdeYQJfg4fpFIa0w0FHpMHZj4qvDZKm+\r\neCC99qJrJvjz6c1XeD974Y2XL0F0pMmes5XT/n6EtPYGmyY7TJ0+/cQNo9oZ\r\nBz7I03BkafOnLtUBbGkWMvy23NXOufxhmlXQlAoWTii3bbhkSadEG1LVQ35D\r\nsqm3DmzdXu+6iBqE4/3MtrAtVZP1C0VYBoBMFt4eZbYsNGYpKgotlOJfa43Y\r\nEYVfk0KPez7WGHvAWgUSuH+BsbUFUH+MPdwkmct08UQNzPuGzdaXE/y9tGOH\r\np/zNJf+XgLcbUncnbuTUBGvdvSwFUKWUTIcDRW1NrpjOrn60Oa1vnkDRxa2/\r\nck3FDIROhuD/2OdyUG+xzPMwUsO0EAIX6Ruo10pVpJ8P70EAEjn08Y7Kddmb\r\nqpkgPoBMx3cWOsq49OXDSkU4fxZlY14RPdqtHDx2YqdmL7ED0zJNk6VRx6+W\r\nDWrwDyxDJHmloMS6Gwu82c5fHInZ5iVwwYE=\r\n=PsYM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-4eada6d_1671645063144_0.25487688745877635"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-1e42665":{"name":"drizzle-orm-mysql","version":"0.14.2-1e42665","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-1e42665","_integrity":"sha512-N9njbhxhMfLsImgIZT5NFEGHsZH1Z+i+x3vDv5Agg042iYvz6UQ/uZg51YTf9uL1X/VHeYmkJhoO9x7GcvKw4w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-N9njbhxhMfLsImgIZT5NFEGHsZH1Z+i+x3vDv5Agg042iYvz6UQ/uZg51YTf9uL1X/VHeYmkJhoO9x7GcvKw4w==","shasum":"6c93cbe233c0c7a73adc071ec826a030aefd5a25","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-1e42665.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBtIdQd3gtHpkJsWzlvdMWeubwb8FMWNr4fQFcMLCCngAiEA0QyjVoq+cpVzhB1tMLRRcbhBIs1vQ2XhH33cq3wfAoY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0m5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr0KQ//f39a2iD3hSnCTNwpKhebB9kx0jy62eZ3e6TalMB9sSf9vJGh\r\noHQIS6zB6QFFmTjP3BINcA1zjww/x4wctDS/lTKpnykeFLEQdfjHW3ZTIdzo\r\nekshvk+CmcAH6DZkTxdB7q+/ZXemQHAH9yxYbV11spV6q62SBzLKY8SdWGzs\r\ng1Rbuy8QsfazqHcxE/MYCYgrt5onkVNoyorqJEkw2Ca1Hd77/MOEYSb5I1CD\r\nIu3R0WxSt2Jveun6u7yJLnFlirC/QUiHkwxheNU1ApOadPZce166ZNPvAhL4\r\nSkLwPlmQIg3SEsDB3+hz13mXu5NjYBwMzObLA6DANWyT8X6GVLP2bBflw5bh\r\nI5LudQLbmbck4eLNqam2SHE4fXM65GHIruzXqn5vlz3cZoS9EtiSw1q5t2BM\r\nBWvIbQSEIdCvsRf/+qjuIvKUlOBPOPoE0Y3aRRC/H3AhMt8cgT+cdlcz5zYH\r\n+5rs4DjwjiAHpOM0eGFj/w2/+l5/HiwJeIcj+KWkG8d4w9K66HJg7vDlSF1z\r\nucUw+j7jp5q2L3gW5U2KfDIV+S7IgLy+NvjyGlwtgLMOnd7AolLUoFITo8e7\r\nQxLzFXk8FPjMjBR3E9d+Jwh7virXfohrCAzuhcLf6EHmf5G+ksuYW4fmSzrR\r\n67Qb22iNXgniPjvxpHZrjUsw+ZUQqXJT3Rw=\r\n=mi+t\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-1e42665_1671645625494_0.8841558690516911"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-e295848":{"name":"drizzle-orm-mysql","version":"0.14.2-e295848","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-e295848","_integrity":"sha512-PPYQ6216tBdaI+NBPijlabBFptn3vNc+rhxiOArem0fiuSWg7jE4cZV6265gvhb5sptsknFBenoC20AUptD4GA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-PPYQ6216tBdaI+NBPijlabBFptn3vNc+rhxiOArem0fiuSWg7jE4cZV6265gvhb5sptsknFBenoC20AUptD4GA==","shasum":"28f8af4420c603de80c0da2537072240ddb5422c","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-e295848.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8+zvyHXvfc0HPBGbuYK1zBUPGF3sMnDncunvaiP0cSwIhAPCUuzls9+NFegGl8kG7lKzwvz3oiAkgxOFz1ev1NAVR"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0t9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoAYBAApHbzMAiT3R0LM0yfzkAO+m0m3hTjNqOHpaeCca1zlXFvRp/V\r\nf2rkLE/Fn85Au33Ji6XfhAtwPA0AO6TaPYW/nOP76qEZ6zjmdl/1siYk8Uf2\r\nYf+VlXIrrSSkev7L/6Lp17nNoWd1cf4cM8AYMJSZzJIGUqbdYUwTDYB77cID\r\nvcCcKXa+oOAWePSD+QlEEAEBeJNIr1QPts8ebRjEs4orQzsudUthkwkYvw/n\r\nQHS1GJLq2Fl5yyd8dzvRGTnMnx7LQGcLyiMKrsdimngpuZsD/Hu33AZxW6l4\r\npNeh8etQ6tXRTHJwnIwSrI/i8PkLrBwLK86hWx36WyLJOHj8aKIRY3zj81z7\r\nXpT52EdKb40XZwcEqWYTInbH4YQHyR90GtnzW7WM+WFhsqGfhqf2wnvjPpnI\r\n4j2ARWVI3sD0R4p4gViZiQe5G7Agvt3nSN/S0ozxfci7knCgtjPH8bhV90L7\r\nfd2GI8UYKakSMG8aIC9CXBC+Sqfuy1ppNo+DEQn8z624tnrUoW+OYgOQCcmM\r\nKr4LJU7GeDBPFmtBReHlW1DjyqfLQ2EiNwAj8koRcQNVRlaROhvRy7pyzuXa\r\n18JtgaYtQGjicmQhe+QIonI62KVKu/eivUX1E8AuyD2z42+CNRTqgCKCloKw\r\n3ZPY/2ThQnozTBmbNrCK89o7TR8y/bUKujQ=\r\n=4iWL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-e295848_1671646077639_0.7891737031348502"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-c153bbf":{"name":"drizzle-orm-mysql","version":"0.14.2-c153bbf","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-c153bbf","_integrity":"sha512-O1J+9zI7xxGoXkHafBqb7T2j8C+nB5VZbuUUjXJI/HHAH8cYzXen7L2HoYaV14wOJfdMwBSu7iwL4WlXzNx30A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-O1J+9zI7xxGoXkHafBqb7T2j8C+nB5VZbuUUjXJI/HHAH8cYzXen7L2HoYaV14wOJfdMwBSu7iwL4WlXzNx30A==","shasum":"06e80b17f36a05c8a778559144d26258f3887ec2","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-c153bbf.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHXcOofSZYq1w1ytelW/H4BppgCNoJU6LtpHyTGdB2uMAiEAk5mVeKTtsNiMJi/rmfG2XK3TW+MMm9W+dPMmWo7O3UY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0uAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrfRg/9GbLVVBbBgJ/rfG2/t8sgXeHX+nyTBHnWf/miUpxch03L22Xf\r\nhBorMrsHYpQG5Q2npFqE2g/+d041v1w1b7Q6CPFIE9atZ+6YFufWHjht91BV\r\nmSt7NzhgJK7guWLZw9Tmpjwm0xrELq6zCZUaKKFDpiTkzAB32v9TjWArQIPb\r\np+kSh+NPqx1n2mvhP00xajcWcN3Qzq2WoKC/VkT28BBQ2Xm2NT9jrHlfqPPW\r\n7qeEG0abp024D4bs4OA9LFroLhKJn4KF1sO70WWEb1H8x6tSxwtFYUIcotD6\r\nbRV4orDy48GMRAWKoHh+ITV9QQ4A3QUIlB5YIM9XrMTw+jVHl8X9PvrkcBVt\r\nYHBUpRRNv/4Q+ykeahEubKChKdRUkr3HGftRk4dwN6ONGlNVN3lLz7FIVrE7\r\napUyg+P4R+IBtJmwd0p4a04QUn9Mu0UMde3fWKsP2FuxZ8vTVOy8INhDKNbU\r\nwQ0w4V+5Y3/1cS8Abkx75DPYGX+RrwqkFxr2EDtPAlzD9SrE3j77meozzb9v\r\niOG+CFuGvpxN2tSqUQV+p20KQQyGq23t+4ba9ZaXlnVziIqyMG1z0gotetl6\r\naQ9ugT9GarAOGROTLRFATnw/6t+teJeoKK00nRSn33lKIGU71PbIQopyV4O+\r\n/XDmV0J7QQo6mJqbz1no9MHVSa28jGP+jM0=\r\n=vwah\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-c153bbf_1671646080732_0.6432744403166877"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-6f226c1":{"name":"drizzle-orm-mysql","version":"0.14.2-6f226c1","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-6f226c1","_integrity":"sha512-wXJ2RZGxsCWe1UCq4FIyPZMCyqm7zNXRj1+3mKvO7OMglZJyg+DJeqRhRwLnklzSGJQPTUmCvVgPo3CPOBjb2A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-wXJ2RZGxsCWe1UCq4FIyPZMCyqm7zNXRj1+3mKvO7OMglZJyg+DJeqRhRwLnklzSGJQPTUmCvVgPo3CPOBjb2A==","shasum":"6437fbc3b7fcba0dabc66f8941b2bd0b3cfc96f1","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-6f226c1.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQYUCLVm5skD09QceWTAzBNcwqcfJy3ViX2VwYQ/R5/AIgW3GPPaD/46zoT9aBZjKXQ9GgEns638m2YI7sqGeclWA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0wdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqDXRAAn/DIXVIilvunv9ivdJYqdxUYC7exepdTy4BdqcYdqNNkKsf5\r\n08sToxu9mHtAbjsHQLaQbnagaCGGi5k9azqlAPaJ8QrT3ycGLadRvIKOLdVR\r\nyhsWhNRhmfRcsYeYbxuIk8C4diAnu6RxIKPTTm+nC1+c05FwaofQZIpX0/Mg\r\n6sxUsBRVsx6cgVj3ea+p4U/m3SDi9AGJYdZStUw2xu9M+3JkujWJRRL0wPz2\r\nB617KnfSOUGyza9kchUIGDm+UW0tkqUxqbENCaTFZ9kkwXpqWM51Y+E3fuSW\r\nxEyOZeHwyLU9GdhIWu1VeOenc/ptFZxAQLO85qXZRg8fx05m/AWDNIyFV6v5\r\nheSgZ5sQ8gQjTmOa94QWjxXfVcWs08K3ghQNjuvWWCkl7olk7taIXdB+DotD\r\nbMK2WLcWCfBE1g5VeVwPjnymV6fk45Wfs+hkGUiLKpQ2duzs9YHrxG0qKVhX\r\n9Zm5rExNXt5aqASFpvTMvdl1X5m/pHbGwtIR4/Ku+Dz5zB+2CvAgxUA07mIT\r\n1UYVnmcp7ZaHwBE/tvw4bMV3Us+XZWcf0ol49Hba0q0WRqAGgaVwPp4WPt1m\r\nn0WPc+McJ1kigywayc+OlwrtAsoFkg26ObDG9We0Zo56B8S9dPQY1sAn01Vr\r\nYyqe5IRoDc/4dUr4YJil4PzKKattHLp7rdw=\r\n=kVVq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-6f226c1_1671646237283_0.10474253809980749"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-f8d0d46":{"name":"drizzle-orm-mysql","version":"0.14.2-f8d0d46","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-f8d0d46","_integrity":"sha512-pTWjwITbOZ9GYUokgq2TTxOjc10KpKS0ay4gT6PKcBZTR8u7tTyoKVfy18TIPRKDRZudDv6BtBlk7Etu48sbcg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-pTWjwITbOZ9GYUokgq2TTxOjc10KpKS0ay4gT6PKcBZTR8u7tTyoKVfy18TIPRKDRZudDv6BtBlk7Etu48sbcg==","shasum":"d5137e3860b3d611bf21f4c9f48b01848529ce18","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-f8d0d46.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBLJvS+xKjwVfhAtpr6IBEpOyu+Gr1zwmfcs5fBvkDucAiEAsZYHm63q/DMVjPURTIj6cqzKg9RLadfefizfwE7U7z4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0xXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr99w//ZR9+I8zUbrhjOcgakE6YSp8ihpf/pYr18GFe1yW7fVkJU/6i\r\nCpeYLCut1dQZcy1tgAgD8Ar79b3LzL8fkyCBSQajYjR5WnGrz/yuS0L3wNMj\r\n3VvqxyUeq614BFMMmje47PLhuPCjuzGknrhD26dIaXyyVzCLibbfvcQT47Vm\r\nVJj6wdyEKiKbgoUTcYhCDi1IbZKTV1rpaouOsrz49Ntp7mieMa94iqnZVbKo\r\njq1UFP5mB2jEeRg2w74E3PEtCPQG6CCMS6ePSSRI0UCNPwCrk9SElOs1f0VJ\r\nDCfE/zJXlUTl0ZBxk5wOhlpXhr4Eyw8eNMYzrw5ipZ0nv75fJQMutSZE70Ik\r\nHjUihSxHM5iv30CRCyV4m7o93qC7p58aPLRLOj97R1hOcjCXfOCcc84eHYLZ\r\nF4MskcuZJOivsxqxLbk1yqwTpghw9TWvrGXsn95FWdZygqU1jV8MMybB1D00\r\nhv+qB6eE777GnplyO+zYW7NDsykK1wF/H13Mc9N9oscE6eusNbzt346DdEt8\r\n6lOeoBouTy8fWZLaHlffvwcumQmc6wVmecOiCvZiZGrfc95YoMLGXeGZpwvb\r\nUJ1Pdwzv98ckkhedHJEwOJtvhi+PxepTv3H7CszG8LuXfRpeWl1VmEeT6122\r\nPlxULWX/U1q+4TCPh6rpNOtqqN2U2Rt1sXQ=\r\n=o++s\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-f8d0d46_1671646295168_0.9132859269588858"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-cce4cab":{"name":"drizzle-orm-mysql","version":"0.14.2-cce4cab","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-cce4cab","_integrity":"sha512-kDnnaRQCajcj/CEInLCxcaCgxJJge9BuQ3G8qE9WIFK5hqMzdFxJprk2QC0QT0C4Ijic4HS/+eaLEpU+AYNYjw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-kDnnaRQCajcj/CEInLCxcaCgxJJge9BuQ3G8qE9WIFK5hqMzdFxJprk2QC0QT0C4Ijic4HS/+eaLEpU+AYNYjw==","shasum":"ecb757b461436b8f6a890b14814ac12b33c219ad","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-cce4cab.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFscV7dRSbFhOD7Tz1/IKM8KmGWHVz7aixLdKX3R85m0AiEAwgTJxoJ3dJBbhQ16+2Ydp+gdGofRc0n6mdyak238ErU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo01BACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr18RAAh4xO8sKwmaF10bZNTyq6QHJfZqecxyI92d+XoNSwFrI6nAnl\r\nQ5CTFtREyMPenun2xdvoR8MQ1OIqn9+fjWJHQYM5IeSRrY38Dn112pgRDVzZ\r\nNzCl3bpZbV8G2kD6z7sl16dZznp8Acsbd9u6HWeJTCTq3Q7Vcg+fIsX8RmtK\r\ndGniTFfZIiIXGZtlcS4sDC7cEuvUJekI38i6FLlfZxAyHI+YCyK/g4IJz3BM\r\nhq7NUbdSiLHZ6naDgomqjKcHDHLlTehZbDRfqa9uiYz7F9KfiLm4Y7z+Evb+\r\nvfxSvn5qYYv4gYivUcQtS0V3aynzNWHjnDEiXE8NEUyWvJHkUjuhCH43Op9+\r\nbE41TFxA5ADme3mEO1Rp/XnyIEXS/W6fyjZiEdMiAh4wDOJ+9Is+A65ab+m9\r\nA9ry589Nd55AN7ohs+lm6gViaaW85moUcZ7YQuPgpJJ++KuGLqI28sbWjuAP\r\nKCaTWGGPXINo/e0vGoRf57SnrF3pDpqinJL32Ikm4WYqVceaCHQFx1m4tLYh\r\nisw9kjYBJmujaNJX94i1f8aqNFjz4Qs/tCHS20oizdz3+mezEaQRIigDgjhM\r\npHuDPmsMZOfsKpIaAs0lvYOdp/9bv9L8iuCL9QsHgETnlaUmeDtZArv+Y9yf\r\nyxafhiV38n2FD2Nh0ZME9fsX5H3XQvAzcpo=\r\n=BbU7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-cce4cab_1671646529308_0.2262660874725273"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-314c1fa":{"name":"drizzle-orm-mysql","version":"0.14.2-314c1fa","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-314c1fa","_integrity":"sha512-dMcZUwgtC3cD7k4Rq0MI6UMKZkOpV1hGk5g/XAyqzOfP8QhSBHajh2kbLnY3vlDdGjPq+ukrNGp3PgGRNr2/lQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-dMcZUwgtC3cD7k4Rq0MI6UMKZkOpV1hGk5g/XAyqzOfP8QhSBHajh2kbLnY3vlDdGjPq+ukrNGp3PgGRNr2/lQ==","shasum":"2f41289b5756da8101a3b61633866411ad6314b9","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-314c1fa.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMHHDs4z7DRDadw0jG96/mQLkqbuCL7jL6g2FQ2NsPZwIhAMAZLf/s+bFpdsh8o1h/JCMA9p7i9jGr0nozCTCpSNsi"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo1UDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqfAA//ZRbCxOegkWFe0Yg/+ULQUQ9pJBg/qC9mWmzWoNq07qHQAgLB\r\n51buOF9C9LXXbZudEuC2OkOa0J31wmdMGTAgn5W23oo+byphLAAhMcfTqWyK\r\naaCUjKNUYfSZqVTO8fk4VRUvHvicoTWwNhmQ4IhTYBeFZT33drXoEPgDLBpg\r\nyYLtcHYmGFjah4SRdc3UwmYlUo01IeuZBHq9Kt1JaCXOw4cA6Z453Uhe4T81\r\nS7ijXr6al876rN6GfAE/l9yS0YniVSSxK+wbPUecMXd+ZRy1krA7mj3SYwPX\r\nHh+KfehLoctiFpgyvt1PvZOlHZvevoZlvfJlvd68xbym3jv9fDYvybUnbbj4\r\ni5LHIrUA3RbnxUFTjQUQv7sbuV5uL/8yUp+9WRK0pAF7ztbqXI6QdrxES5cL\r\n0zOphoUqHyrG7AKnQJ5PvRT0YfESndG6vnrXhAo19zAFF94uezIp4Y51l6cp\r\nmG47Ht5GA7ALXi2Rt0WeV6VeaWisafgUxpdDfd8keKqffHIauIpWCwJ9FQ7W\r\nvTMty+KR26e1nYw7mkKdAYd6qta+vKnPO2v6EeKMfUVPZHaMNy4lsXsZvE40\r\nwSTXvxWoYLU+vfOzxNRL5pqBgY/rp8P9H7Soe53hXIFmQdLY1mVSrBMtt+dv\r\nRqHQt6z1jpYWY4iEgAYCpRcqFFSqB9N89F0=\r\n=R2e0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-314c1fa_1671648515795_0.9954251607005873"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-5b14ef4":{"name":"drizzle-orm-mysql","version":"0.14.2-5b14ef4","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-5b14ef4","_integrity":"sha512-vJopp14AGxL6L3M2p5wl9mhJRl5QZ9FpPXEr6YH5jxI5bpCxopAFLTvY06i+TERjHODRyNusoocxZtHqe8FFGA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-vJopp14AGxL6L3M2p5wl9mhJRl5QZ9FpPXEr6YH5jxI5bpCxopAFLTvY06i+TERjHODRyNusoocxZtHqe8FFGA==","shasum":"e633ce5bcd5295e087af2080887a14670520472c","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-5b14ef4.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDDHM6ojuOYn4Dbe4bfaNNmHZ+31UHbdTzgznYQEP4/AgIgI3/p/PzS4s3OAdr8IIhhkLu3p6nS6yp7oJaaW1cX93Q="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpMXNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpfmg//Qee7EKIc2MaEAKNxy9PI58TBjJFNMKyzLXPIIzor77c/D67G\r\naWT2cwgVb3LLZYzXyx00TffcAfeMLb2qx34Lw+prH6iQWh2uAC8ymdmg/t2i\r\n8/Im86rUuNiXBB7QZiaBx2RpHieLUI+MgqphoovypzJAZQk4FVNYTFMFjNsk\r\nMalbQfqDjc1k5XQZ7hvwu4OazFIAJJ2qWr7wxxo44QzY1lI4LLoKcLPuJQy8\r\nXh7LcHofGQ+X6U2j4YC8Aer49YtsNL43pH9c8jBDTdwn3faPwkRx4yVgu6UG\r\n5IgS2ujVYDrecdt/64PTMjJCOWHDv7WySBKBdNM3vMIWV28i1pBYxTaAxlAt\r\nIrjI3ZjtJlt7Oo5V6gfxHF+Xhx9wtgMzOXtZkzg+7UXhFsShxjheNpVjiyMO\r\nVyF3JZ/Kokfv05o/Gi78zY1oYf3zh1+2PgwORST4WK46Uu/crDI+M99HEAv+\r\nqgM9kegTPugWzVCTPdLLGiAi7eSvbuyFyCt1x74R3jBiaqTQkTVz++Rc0Sd6\r\nE2jRCYPrghHr6MbqbinSvhUKC514QP7fTf6ltNhHj+jGvIlsg9WOydVcrOaE\r\nkxeph8TYm4g2uXUrU0WcKZPaMR4w8arlDn+OKtU1wNPjJx5BuOHrnF0DMkj7\r\n5DhpPjGSD1lx9gv0srbg6jHp5WYgWRKNRmE=\r\n=vDEv\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-5b14ef4_1671742925749_0.33999815490984364"},"_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-9ba6169":{"name":"drizzle-orm-mysql","version":"0.14.2-9ba6169","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-9ba6169","_integrity":"sha512-ybkqO9zSVXZpybKH0buJibU5O4Vlo+pypPwQuEKIvpF3JqgayAGOr6WtaZiD7zgF1Dla3SiKkfYZ1xyy/beolw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ybkqO9zSVXZpybKH0buJibU5O4Vlo+pypPwQuEKIvpF3JqgayAGOr6WtaZiD7zgF1Dla3SiKkfYZ1xyy/beolw==","shasum":"c0ee02d741cf5964145e013e16c4cc24888cfdf9","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-9ba6169.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDhFd1869UgEVxX/M+mI4zMiuPxzSs8mK1sGq39+QldwgIhANEvbpB+lVT0eLfP8j02ycegECpH9IJOpw2GkZT/iU68"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjrXroACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpGMg//Qd5HYgSA9+hNmW6gcaBs7TBUOdw7qmhvMt4IThtazisJLvor\r\ngjG1Pj/9cIWwS1d6tfmKFc5w6wBo/Cdr+q/WegE84Jf30g1MXcEu0KrrK5/T\r\nW6oE5FyWsAiVb7DvT4yCYlq2sAVSUfIw9qgnKbrQNxYxVgDUMKVM/Cgb3M0I\r\nyV1YetVH/EiBzwmtomxb7dKO//aKHr1/JF31J2Ylc9FdAlRW4QEjzcV1xaOt\r\nhg9JhsbBqF7gUjzunGXVQuW5Pzza8kaWW55Jxe7Tr1vcfyPt4RcIu5SUibKs\r\nQ3BdeVky24i/yeTrUd9llbCAVGp2J1F7NTTNVus6LF4w6LJ4uJTmX6UQuPfe\r\ndUPURqedDTkHNnlGkzMJyFtNYN+jBKwjlFDT74nUdwf/9FcUKojTGb5B5VeN\r\nKqT7YSw2GK2/JStUnugAtQ8SjzYHlu+T+9QJ2FbN4siuVWvbRaMiYOS9RVPS\r\nEAGc5vKwTSwvxJaBBpGhgYfvfQ+/fExNn/hJNT/LZE4F7zFYBhFvjopC78BP\r\nZUJqxsfU7mPtM17n7ZTGWUp8J5oH/xSwoUVNkdIiN4PK1+6I8DYUudxLdDL2\r\nMvuoJLlh7AMxrsanUr1XaKvoJkB9ZCblvDqpBVGk/7eKNEb/B5MStgy506Zf\r\n0vmsOP5kF+zRcU7Ewm3yZmb8w+xufZAMA3w=\r\n=Xhib\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-9ba6169_1672313575915_0.7382912409948086"},"_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-5ce7d69":{"name":"drizzle-orm-mysql","version":"0.14.2-5ce7d69","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-5ce7d69","_integrity":"sha512-buh/xS4v/aqLdDjL3U5CIAj7/UNoyD94P3qrRIeQuvP/g6llKlc3J/gXa6QeR3ZXScKtxocP5Wf0r2KkEVc8wQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-buh/xS4v/aqLdDjL3U5CIAj7/UNoyD94P3qrRIeQuvP/g6llKlc3J/gXa6QeR3ZXScKtxocP5Wf0r2KkEVc8wQ==","shasum":"05823cb69ec4b7875f75dfd949ebee0f7fe6fa46","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-5ce7d69.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCKTPJ1gLZwDJbbooYWqRA2t+Z279dqCC92GI9JWK0KCwIhAOEhC98+RkJclVnAFyrPB7Tl5IBjEMAaNe+SeM9Fc3Eg"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjsyZjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2wRAApSpZuIpUBj4sS+XUdl6j8qh9TAVJf8ZJDmsCAbYM1m5RhUus\r\n6p1j/ItwN56zkYXdN5vR8kzIlzlr4u+6arUOQelyoaZzBl33gijSS04UKGEm\r\nqwznM6y8mAQTdN3zZpaPbj9Lm6zKjaobJnaFGkCisGSVuzCP3HyXhyJyMAUG\r\n89p37Ut4NpT8UWGXJuJ/dLBe7kz1i4w5ixbZAma4BVIVJptETUuSlgBOqDib\r\njfrwHUJDNI2lod9Pe1LzeKUN3cx1T3V3b6PiEP3dVWDNQoaXw3UF5bbDujZl\r\nH1kKTVQ/WRyTGn7Ym4uEOQOLb+qpxVcsKb8tDuAdcaS6gR+e2d61CNdeMxBp\r\n17vli7eh3SbWJQXMCKSM2D1HYbITtlMa8KpzMuddQVUq/brmpf30kEtS3Ib7\r\nE80p3hAJKEazlL/3OwVVyeJ6iUWj7hkGXPCcdvlO3DQL0EX6J/goPrzc9BS+\r\nWowILwTNEzJulEHAq2TxjxUVlSwz8NaKPPrbnOEEGQ8c7d8KtkuKY1VBcAkf\r\nfohAaHQXhE3a/vIByaixIMrtcYL1qzcepQPJ/fWwzuMFEcT4GnCBRFvPz5co\r\nlB9iY2TgiSQN3e3nPh1l8nH99fMprM9M4ZyxyhMuv7wUVObHNPqlWniZnyFW\r\ncc7DuWaKag0GdXzScxNO7Mz+Mjgpqvz0Emg=\r\n=PkHD\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-5ce7d69_1672685155522_0.3653182986121908"},"_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-4e3a5b9":{"name":"drizzle-orm-mysql","version":"0.14.2-4e3a5b9","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-4e3a5b9","_integrity":"sha512-KZqzEPfRI6IPJwbpFn9COowhlmLPvoYIvbtYCdz8ycjJ5Rwv1x6K+rUeiLUoiLtj+548r5xJlaoW/l1tU8qqsg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-KZqzEPfRI6IPJwbpFn9COowhlmLPvoYIvbtYCdz8ycjJ5Rwv1x6K+rUeiLUoiLtj+548r5xJlaoW/l1tU8qqsg==","shasum":"bc8b61c46dcb8a232e0d9f826510fec998f27cf0","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-4e3a5b9.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAKixPrhBJ5JM1iz44BLkHYmML08JJzihndYtPW5DeY0AiB29iWXXzYNM/5NLs/yQqv+MCSoZ9SfUnTRcgBNtBVlIg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtrVpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmog+A//dk2a0jHACee6RZnTlogVsQoFtA6QfdA43NUDjZepF1r1w03P\r\nI3B8EunwcrZlKQ+7RyeBBAqeg74E64wR8v7+xDrQHd+lmPvE2c11T/Bj4GmY\r\nuZpQbxC3ni1lt3UKZb1RIyzrvXaG6+Ap2Il5cSN1gCwQO0pjC8No8by5yoTB\r\nfCF9Bwl/49U687MaIPxEisyA5s8ilKIVVo4iB2iRUbOKgku6vUtFL3u5gUuu\r\nATR7UkuO5oCUGboZNZ4bVnzsaVoOZHbUjA92wJ7xoT60xYBwOJw58aPQM/qf\r\neTkEsC7yMFMx1ViI6kRY5AF+A7E/jaDsaTyLMgtnNx+6uEVOgaAZVCZvxv3E\r\nga/ufdMiOkdycs6q7ZOQa62DPrtUXJpmyQvWSJNPJzO/FaU3a05w+dfoZnru\r\nhIF2nK4NPYFvRc0D2w2YVogM4w6X1G6G9LTyNpqlF3mEiaswVWjceW8D5wNm\r\nj+pCHDmg0GYQzYmh/y36jHLEBPq+2wuz8QIbpXkeHz9BqJ5YyugXuN04iZht\r\ntzqTqFNX9hEDphVEqJ0fzaDnCUmz7eoxCjvbhT8zAdUUrQTrVTtP+PRpaUu8\r\nJzRCXfdQa4RY+AXMvqR3383QR0mfdlQuXocuWtY79OApFaXsS8HB3J9HyVYP\r\n24dBi1IHxLQD4OWbUfAQn5QvLox8HtI7fIs=\r\n=Z+7O\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-4e3a5b9_1672918377720_0.647264789211333"},"_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-dd27c86":{"name":"drizzle-orm-mysql","version":"0.14.2-dd27c86","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-dd27c86","_integrity":"sha512-Z/xMd1o5Pcf639GPysm4S4XX77Ku2VMrmHc5ZYzweJVtx42GsNWfwF9ZHv7PKij7fEc6uujB37qgCz8oFNu/aQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Z/xMd1o5Pcf639GPysm4S4XX77Ku2VMrmHc5ZYzweJVtx42GsNWfwF9ZHv7PKij7fEc6uujB37qgCz8oFNu/aQ==","shasum":"1c13b8d9b080133b53b22a30967961c6c9dc84b9","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-dd27c86.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHKEGNzqyQmdsRIb1049/EQYs9tH2r8oeSknCuLpC7XcAiEA2Wozya1XIYs4h1jan8tEc/mlnsx9ZU/whnwPfqDjiIs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtuwKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpyrw//QU1KUqbZOgiD35uE1O74A7scC+DSGp5mSNr7BK0cIYOzviHe\r\nmRWkxnNqcmUTMKtE+ZgBuLl8z3EN/S598bcsIOQhtflZFVwcYIGj8hqBia7U\r\nJrOhinH90YSxQHNpawevKwhdJ1qiTvW1ncu7nN/8kFdeM8/r2uYfqAMYbWaM\r\nA8Mn2coGmE6HTu9VQhrrk2tzRhg6HBAg2dVtn2FlZkgpk2kD2kcSQNMyyvKL\r\nrqUOntTYhbdQHYhrjOlSl3f1ufFYUDVIZlL/kt4bGtEeJnZWK/nrUt9sahL0\r\nsxS21zRKGZ1DaC1szpVi5M8hywZHzH1cCRKr9J/1uYb2R6d5evttG6SLGQCC\r\n3SvYjKguXE2XuAC7ovC4fo7JhbT3LyLET/qTV+i0HqJr8z6yoKXtadPRneQ2\r\ng4+PPKwbz/7OTtGleaLpKTQ48IpefMSL9SdxHWWPGK1r7ZCt3bKsyI1Pwveo\r\n/EzUOBSP6wn5H4mlZvFxbeUvWSdZDY0guSRigVOqYEG/Icq8MqNfUxqy6eJu\r\niv1mIL0NqIvilKtR/+SbSF0iN45duPac1AmXTIOBGXnKGahLOtl9wvtp1zZZ\r\nwaiWYLgX8QXoB7v83z+v6AGHvsCJSKmSTVkyuba0g4HOL5LswH24oxWZCmZd\r\n83ByvZ3YmthxKjTPypNNiJl+SHITo2X0COY=\r\n=a+5/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-dd27c86_1672932362232_0.9622263366396862"},"_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-67805d4":{"name":"drizzle-orm-mysql","version":"0.14.2-67805d4","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-67805d4","_integrity":"sha512-woXlH1sllRkm7bFYADtOGEcWTygjhuCom/smyYW7+1kbMiVnR9mInuUmUIv2aD1nHjmge/sFd9iNGjBr9h/0Ww==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-woXlH1sllRkm7bFYADtOGEcWTygjhuCom/smyYW7+1kbMiVnR9mInuUmUIv2aD1nHjmge/sFd9iNGjBr9h/0Ww==","shasum":"d795e7733435ee32457daa597d4f2e0d3caff5a4","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-67805d4.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC2vGNrAAVszt0NQ12IUu72v8bz+s8iir1Ya8fAkmZghAIhAOBYtUrjbH/UWtlGp1QE34EPdbbKt6EcRaZ8sJvmUBE2"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtu35ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrsSw/9GKhkP60cpNUhK8Xvrz9KUjRHXmC7vmTmAthZDq4b7u0BLfmh\r\nRCcNDkZ1/ojRe5nMouDYPijDJPmXiBq8OX4AmzXiXYSoLL7lXXIcW7dF3Lfi\r\nOB56w171YosyEhnHawO9uMGMlRdPzK0HxDS/IcDRcnn7FsRQr/wn2sVZhKSM\r\nJR9rjLKGRZncTZhL+Sv3NCL8Cww6S4mtEEpLLUo09RoWemPtI/I9JOo7KmEj\r\n9oWW9X39jNSE94Flq83goiRfnelhRMC2hmE0mWdNVd8wybuzLC5k4Fh/nu1f\r\n5oOgrEqlaI2DwEi+Jb9qfVXtOVUw9z6cO7fXQPi8fGaPXoCpCAQC63VnSmn3\r\nLJfe8svCWK+sVb/tj8roLG1cNaPx/21HwrTzIKcrZC24EiMAk6aNhntfwB9W\r\navlVdqOtJMmyhH8jb7of2cRbqQJC1t3snSE94k21QAWIuRXNCRwt7XcZQDN6\r\nCgMBjSGqBniSxqXSfT5U/hszP4YbsfvB7Lpr6b5o3bq6H6/HlVdiCzlywPr8\r\ncCw88QNyGDSIYZUhjVyZjWwkrgzGkCjWWL2t/JEyeVsEfK+8m8RMErU/UJex\r\nVAhoIOcDJR1TEamrFmZJfA/gW9K5nVe5DjDYIhqMlcleGhaIfLINad09ff5V\r\nHoKqztKRztD070lFwvOSEiWgN1Wqyc20FfI=\r\n=azym\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-67805d4_1672932856808_0.4929070774475186"},"_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-1bcee50":{"name":"drizzle-orm-mysql","version":"0.14.2-1bcee50","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.2-1bcee50","_integrity":"sha512-EV+AfW1GuuwhHTmWpr63/hl1ffzrSeq/8Rw2RAoHVAkAiXPmhvW+QrAi4dKAoVySI64XXkAHJErTGr4uAwvgAA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-EV+AfW1GuuwhHTmWpr63/hl1ffzrSeq/8Rw2RAoHVAkAiXPmhvW+QrAi4dKAoVySI64XXkAHJErTGr4uAwvgAA==","shasum":"500fdedf5463361d8af32ce1228e69a188a53fb8","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.2-1bcee50.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAcfjUYOTKR82NT/6wW5e+noFEN7cHFGrXzMwAjHW0vHAiEAx0EQXATJ3dGJ1LG9ONU9K2qfhWyn3t/MRGAvSjSirw4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtya9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo5SA/+PH7TwqO6SqYeRGRbxQJesLK7hKvZG+8gqa40S6iyg7SDYCrz\r\nD8Ex9DF7QXY3F1yi6s/cM0wArTOHjxNhyJEcDdowWu3LmRJjeoEMsnpz/l/p\r\n9IbNJ894kZdfq4x58ozqKKVGb9okQj3NRWwynh/W5c8MOj/zC67aT0dEPV39\r\nccyo/bIwPlb+c0AJ9iDGWsOV9guOtATg3Y5HQarYSavb8hYjd6jrwbpP97Jp\r\nPFcpcfx+Ij6ww3vclPN5NhBSrJBBW4ik0p2uDmHBFTL/XsYJJWLoi4mFDkrA\r\n/EadE1iz+OZgxAkE7oD8tBdjPX+jBVn+yYls68cjwXji+OuOXClsEphuGNAD\r\nbVExyPZmndTBZerPi6eQHN/wyRihOf2nTE1AdFGukOVYV+iz0+Pdh/yQ4ILX\r\n04KbcDLrawlMsLIsTqW+FEOUfRR49UezwAlCIlYNeGwHmeNy4zXL5Zd9eB7O\r\nArIl//VJ053LSZIX2AoILfzn/A8HH9NEsOWMMOO2PhqOaubNnc3O5U50q+Ny\r\nh4e95ITohUpdlf/qyDFxD+EJNlu75TgrQgjF3K1nRKEm1g/mziLcmeo4KImn\r\nmYhLhDrh990zIVkEeLTi7j7EX3KHY0C8AZEkMFpqAv/txje3flOVtIMPCe3U\r\nL7IcZFPrrAmqy1QGG16mw5NgjT2ch8k0f40=\r\n=QTxG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.2-1bcee50_1672947388794_0.25083305194613614"},"_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-mysql","version":"0.15.0-07f606f","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.0-07f606f","_integrity":"sha512-Y+n+B60oaCi7xfNixyeWZsBvmtXZ/elwk2Jw//ZENpoNUDofod5SDMjNLRdHSq7/hq3JqZksr5wu7/J9c4cv8A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Y+n+B60oaCi7xfNixyeWZsBvmtXZ/elwk2Jw//ZENpoNUDofod5SDMjNLRdHSq7/hq3JqZksr5wu7/J9c4cv8A==","shasum":"7905ff82dbd4466f7ce9bae58520d19a59839bc0","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.0-07f606f.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC0gHLKoYUI27LF6MawzQQu1+xlTr4FsID3sAmD6VAnSwIhAJzp4EYdlwV5MnaP2mU1MfZmqrGOPQnTwe1doEx1sl7P"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjuDC1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr8sxAAocBIX9bjX1SjBenJ6ahOkpbM8iYjFrFI/19jTP14LVzvoQrJ\r\nh66K3BcuVvhDDf/7uCJb6btdsu92Eb/PihaHGs/bYmR+IfY5/8SqNz05dIGb\r\nD0yK7HrQq4N8/khl8L3PREjPK6el0/LvzLlPBEqtFw/HCuL2rAOaKVSv+flP\r\n29Bd3RAivC5bkdy14tYG2BARZnTzsokxsg2rhEShWiHccau3NzN/uil7KfPJ\r\njCtBoKV7Pcsel6G3vGCXv3kGQkUQeXvg5/Odw/NMjHLKRnTns0xDXhlOOJ4w\r\nwN5/lXft33F+TPwsMs8QKzLRFNRsQk4tPWoHeXqjk0g9O6RpEwS6vKNioewr\r\nliDli2ljxrSoxUYT31bbRW3hZp7PRiCPLM2MeP46YFrNW+6k0F6MR41ROQT4\r\nwUkBgtsagR9YDwR/NCyez6fGMnSOZg7wG4CSaKm+avJYpclE9rtPr/ERZaax\r\nIeZnRj6yO6T1MtKDHbkRGLOS93zcxITXwJ3dTltn94n4d7vVtxqVP03OAqnS\r\nB0qx1GBdyNAkWm4o1RtuEoTGIVOLEDybXHfv2LO6qDJN9arZxPyp/0fNthsO\r\neJwgMEKWVz4KdINCAvYfYSk1Ugz6/y0OkTkq96IHEtg2JekEZLirX8fC7Xaq\r\nTZo3v7SSvo3oItKHGC/CXV3WPlQzZ6qbYGY=\r\n=G2Vz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.0-07f606f_1673015477772_0.22281609834087046"},"_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-mysql","version":"0.15.0-a90d3bc","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.0-a90d3bc","_integrity":"sha512-IYGiz0jKEVELf44tXQXMnkdNsERsmNl/iWr8HJRUN86ixAOd8X9ihlTNCKasEH7395Ais0hLnP45USk8FSEYeg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-IYGiz0jKEVELf44tXQXMnkdNsERsmNl/iWr8HJRUN86ixAOd8X9ihlTNCKasEH7395Ais0hLnP45USk8FSEYeg==","shasum":"afc42dfd7a945fd8cac63ca7a817fa1193d1aa74","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.0-a90d3bc.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDmiwsm0F0eMhoxub2iEXmZWyL1sUBIjxHFyjMqsehMJQIgIZ8xtNXhIhm3qAnFLqpP8tN1w6JIedwWlACAAWj4X44="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjuHB1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqBag//QBHGUiy6EqgZkk6jl6Rganx3CGhbgZ+DicjrlIY44iDsji5C\r\npaTehE0u+0QGeiDSP9iYpsY4LwOGxgkXmFQJQuhz0NIGyq/S/iZRblaf19XM\r\n29hvuEZ45AIIDiQqbLyct5sdV5poFuH8QIxmZvkhkcSRzElGsrMN11sfe2Du\r\nEvFD8UvOGjWYL1pWs1KLLaaMNcWObMC7qt0YhEeOos0sYKo0HXM5DKjcX2OC\r\ndAad7figGgq8oBoNn4pUsGOb80yO3KiPR6+OyRkks/wgi08mNozWmLqfRO+4\r\nqe0RfDPag0rDZVu+X/C0bb2h/iZin8+7hUVESCetWrrM2SyIMUk3G5Tz4oYA\r\nI1y2i2IajjpJOkYchtS6q1bcct+8mYwc/nnmNwR/cQqSdLYkzxr9OhmTZYD/\r\nSo8l159cQltFEV7emiV3tGkMo69BjXHEZ/gWYU++RQnk+ix+fJRNdIDUU79m\r\n4PrJ4x4tqq6ysyxNVRB6YTYVG19JJ+kltX3jY8EpY2RxSaozoqC5p3FMbyMz\r\nitk934J03KdlfEHBrYWFLSJvgC4Ei/NUXrXhaKRIfPGuzTYCOpLsBIs0Fb87\r\nF3tm+KrpVyHdqXm7ocvHzjaMLCiTFCDJP1/Q3/j3qB26iAI2L4swhB3ZV9SW\r\noj8pp9A8GSeoHLVAWT+AToqLyz/7qyXpxdI=\r\n=LSnx\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.0-a90d3bc_1673031796803_0.6329110981765587"},"_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-mysql","version":"0.15.0-7d17618","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.0-7d17618","_integrity":"sha512-W2jAFkfGtzz+Xt0M2OS4Mvb14WIxdG1m7HW99dSWbc7S8YVg/dogzvON4WjUoKsWC7Hwq41GAosD1/NqIEb7Ig==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-W2jAFkfGtzz+Xt0M2OS4Mvb14WIxdG1m7HW99dSWbc7S8YVg/dogzvON4WjUoKsWC7Hwq41GAosD1/NqIEb7Ig==","shasum":"3b7d2fa161ec7bd68ba3668ec30d26939f19897e","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.0-7d17618.tgz","fileCount":147,"unpackedSize":221217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTbplARhSL9r5xND4fhrBQeVCanno+n1KiqOondab//AIhAI8zJfvNIlqXcJ+XI1JczyBK6pdkPd4E3mR6TYo07aB3"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjutPqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpt9RAAmW7p+aGoOByocOPnRmcF3ztaOnSaQnIsWjuy2v4dmtJCITeq\r\nBbBDnuQr5Cp8umkAmIFF/xMJOj8rmgvKKzOEbyG5Z9juyMASCrFZ5Y/4Hy7c\r\nsRzWtBRMFeD+qEmPU1RL9GIA4KjVavlLItaQZ4MctRiVndlbu0ONXXf6QOZw\r\nsUfm5GJmaalSQXKCOJQJpn4v76cLQ1EUpAZelhmejSjntn7I/ngSzMMvBbXq\r\nPULDc1gUac65sqhYpW1lkBwgLtRaQ4/mKrm4iLC0hS8wsKnmb7bdm0YGvCcW\r\ngv+CbwUwtMGRLGWGbwXPrr1uqqhEUe37Y/LeormNuIFnI+57y1AXyZYLMm90\r\nENwwktQt0VMSS8Xtguxug/skDdvfnU6HBi53qYtQx55viKVjdiuNbRpmWIiU\r\nxBg+X1Q3K0ssj9IUKWoVoSqGAHi8ZjJ9YwbBt3DrEN8GizLSEkZjmCbLlw83\r\nQpdGn+IVGwi8OZzZuWHz+LaAhlHUTCleIA8fxC3MFB1TtkXYOKTGVjCBVlSo\r\n5/a3ubSWYJKwvO5/QI2Y2EcLsZsIxhLZyjEejlCHclhX+Sy2IK7+KWkG7w9S\r\nAojAo4oNGmfJhEhWqpUcGPBRGYS8vMErsQqKKPKerJ89Aqy227Ldnqp0RCl2\r\nBoiABip1amY+WgLR8odltq5zMmrSZoN20ag=\r\n=rmMQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.0-7d17618_1673188330096_0.6416740762874811"},"_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-59f0a3a":{"name":"drizzle-orm-mysql","version":"0.14.3-59f0a3a","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.14.3-59f0a3a","_integrity":"sha512-cXj5v78ro7CpjPidmOL7oijLKODdzXRSoq9MzTJouOj87XEeNxINTOegtyCZTKQeZO79iaz2j6Pz36kh5utQSQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-cXj5v78ro7CpjPidmOL7oijLKODdzXRSoq9MzTJouOj87XEeNxINTOegtyCZTKQeZO79iaz2j6Pz36kh5utQSQ==","shasum":"d0ec90775724154b596cda07a2c95d9540ecbe72","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.3-59f0a3a.tgz","fileCount":147,"unpackedSize":221229,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHBk/ERs3Yb88qjEi2o9vgN2pfXB5Ni+6x9/l7RZQozTAiBFihdSLVtV1I6kE5nDv9avFB3ZDGgPQemeG8sQqKrGUw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvCWJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmof3g/+JVQwmVvb+z9e/CmMZnvs0YgxpM8plXQVAxpG2TmzDebBHktI\r\nidXhjQLZbP2wRYptXgWmM3XrLQXkih6RMKxVuk4p5qhult5iZtyl9v1gCdbu\r\nrZaIR4ADNF8vVUfUssR8LkiBOFBIo9tycet4DFHBtExv59dNBFhMNmWdiPXk\r\n5mJ+KYWia9OGhnBwOCw4PlXCYMNl6ZcixzyeVHs0ZlJw3Pok20i4RUe9yMQu\r\nhnxupko1i0TQbaWrlgu7T037KVqUxMgXsJBGP+aF9yid989NlyCqY7hgWQCq\r\n9R99nMkB69y17BbnBDCPUUpfNaRw2q2VYIswsMYCTOD/h3pRIFA2Wqxtz4hH\r\nxpvRGU0TpYzF/G74FTlcxUCohtxpVb9VAiKw/AnsNrtH4D7JNdE0H5z7EBgs\r\nm2U5KC+pQoJV3+JmiZacC63otQ6B7vUqomZ++6bGQEWJLqNcehUCjUwo9wt0\r\noMnuwzBZznySHNHiJSCRoDosH5clZyhmITCbPe1HJEFN8RN7kleTWewNPD9c\r\ndcUGKVtWuA/ddT2zaKC0DmrnCMuBkNVPL9UzVAPk9vSOXgWQk7N2SL6t5FP0\r\nzxluuCQc3bSisJYp85tqUWtoCtEKiWR9ptWW8vnWtpXNxSNmT9Rqww9ylioN\r\nL/JYJcDXvQk/c9HulY11koe6Jm1tlmN/0aY=\r\n=hbcv\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.3-59f0a3a_1673274761030_0.2652758204190171"},"_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-mysql","version":"0.14.3","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.14 <0.15","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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-mysql@0.14.3","_integrity":"sha512-DRfF2g019Coz7B39ncuHbccJi2XbzHph94KRlqDtPlo5Tqx8xK3L2Xy+gTFB3Prc6SXM5zHZS/wItpA4wJruJg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-DRfF2g019Coz7B39ncuHbccJi2XbzHph94KRlqDtPlo5Tqx8xK3L2Xy+gTFB3Prc6SXM5zHZS/wItpA4wJruJg==","shasum":"cbfb6d94a4d21b891df038cfac0c6f9c7f644eb7","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.14.3.tgz","fileCount":147,"unpackedSize":221221,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC7/w1zq74w5E+zBRzH3EZ4R5xsVUNYznvWCBsFeZVG4AiEAloG1SnqK4SWVVQMLQGOhFXrgS+Tl8ryJF3KUDnpT3HU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvCZnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo/JQ//UZbgO/kb6H5JXnwrj0yEKlT9PeGQXS5n+anuuNx0qQ80/bIL\r\najqLZOw2TLLWHn4yFlnW+vjxb5DB2XRxAGSWqd/YdBES0KnnSxtJSUG1Gk93\r\ncdhgr/3OnybT//PBNfSyOhL2MFzOWmr6/JQN9nUgnkQLuBgx+KnbNc1+V3jS\r\nXJs38v47hVWHMY42y/sJzvFS0vLlGDtA9+ncO/gu16wIFHm8LdP5yZyNdbCX\r\n9BtKQ2CG8mvD2L2/gmQluRxXovtqUSX572nq2JK6v9IQ4S3tWrMAIeJS+oPU\r\n8Pqv293r8O3TnhBwo0ETZVuNmOwBGo2DUnw0DFtfzi+iJnQMmGicz9Zw+xH3\r\nQxJAoe0QFH+kOvfPuCFbB9jByo+ZgnWu1IaaS90rQlCnd83IA+ms0rCFOLIu\r\nJDUQB15PYcx5nl/HiyeCK/RUbr5mXBxjRMqMR9qHZdjEiweUTOuoTDU3NUmf\r\n4vYpdIOYQstnEdj9rGBNk/6osMQ+XWJRkc3HSB4F0k0UxHMUGP3uipHMMahf\r\nr0D9I6Yt/WJh0lF7HctfITdRzW9lyivDCqHiKL+l1SC5sIz9FWP7a0Xds48F\r\nfKZE9263cfkQrKRbdz9NVAdZ3rOAtY7rHBMMXfmb7Fo/EZweenENrkk6ZY1G\r\naU+KKP8MQ+/tzagwVnAaIALQitPMTE6q53g=\r\n=qpu1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.14.3_1673274983555_0.22571580339114217"},"_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-mysql","version":"0.15.0-2e1e5b2","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.0-2e1e5b2","_integrity":"sha512-P4jbM7pnAohTvaSVoOKtx/oH2WpqhVeZSYmMcofQ/szo9PZ+g/VGZH00Nhk3WnWAgyDnHQfxB6ysoguvI5BOkQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-P4jbM7pnAohTvaSVoOKtx/oH2WpqhVeZSYmMcofQ/szo9PZ+g/VGZH00Nhk3WnWAgyDnHQfxB6ysoguvI5BOkQ==","shasum":"5175143772e415d25cb9b2c9077459d8a2d47160","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.0-2e1e5b2.tgz","fileCount":147,"unpackedSize":221229,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG7Mf7ct/uWaNHg7xYi6e8MCBUqf+RJlHi6rdfLD88xgAiAtLJc7sfvjg+rt2lal64n5LmR8gqIO3xKQzGUrXhuTGA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvUttACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoixw/+OUtiLJlpzz4+OzEHU6KH9lDXzSaV/u7aTvtVJZBhORDC1VX4\r\nfJq2kpk4bC/tj6a72KqnoL3jOgcgIcvEhHSztRyVdTrp7nrFTOKGwcFzFkyt\r\n0XLNkYOR2BIux0w57w9+0kfAaQFoXQvX7x6n01Qjf1t5iBMVnZ8Aub+V3aQU\r\nQxIBTZJsbIkuv8z0XWmYLmjkPGAc5lf16BPQ4r5Qw+fosFXwR1h5kbuJF26y\r\nwbcHqFYJngU15RbZwwgetQNiU0cS349YGMfoylyuj/s39L/ZZh36PbitsMy7\r\nknakT4SLro/OOAkcGiYK+LJL8XDjPT6m+Z+zukWK3kQ6pQe3IkCk+39F8wZl\r\nLJamtiBTZh0SAmG9dJjoQZaA+4XG4p1XjsOkH+aLMzMlNBAnZPIL4FXgZOlC\r\nTo9jnMPaghsAZNifc4hzhpLquUTL1yER48wuZX6MvaGRnkWE8Ib1JRNifoFs\r\nvA2Lg/B4zIJtjXqOx5oKcFHlX4HphBZ/6wcf2fr2sCHV5K6Kym05r6/PnO/h\r\nwXeaLa0IqyKbqIKPvFmpcHCiGhroR/11KiQO2B+M13bAzG90BXoYfc7GbCyQ\r\n/CTN89wE1r2vaVgY6d6TsU6dKOPfBoVHFpMyD8IsWQOQMbm6N3uqPlEaBnq5\r\nGbeSgOE8ddTZiLrpDu/jlfuZ3wxM5jgf4Y0=\r\n=/Xlg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.0-2e1e5b2_1673349997538_0.4384511237974402"},"_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-mysql","version":"0.15.0-60954a3","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.0-60954a3","_integrity":"sha512-qaKWG4m4PBjHODuY1YS1GX+vZ2bGdQXXiKBAxF5c0FmcNmicYx63L24lx9K/RhHXfGmsu4Bc1Qx369D+4+A4MQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-qaKWG4m4PBjHODuY1YS1GX+vZ2bGdQXXiKBAxF5c0FmcNmicYx63L24lx9K/RhHXfGmsu4Bc1Qx369D+4+A4MQ==","shasum":"7fb77f8fb09ce60577c17109ec33b40b97d4da6c","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.0-60954a3.tgz","fileCount":147,"unpackedSize":221229,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBxCE6nJPu59AHgMI67pktSYaTkkoVec3YfICMM4uovAIhAIhEvv1IspPOYIg/G9lU6QNSbL7T0S1F8DLZegRb8rVi"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvW5xACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqWkxAAhVQy9PmAblelq2yWrVdL2qWbB4EqEsVWybMM1fX/JcRIxuOs\r\n7l+J80xvy7xcbCyGRvFmbXAvtNEpKJJBiz6Y4gzV+mCY5FePpntVUYA+AhSE\r\nwo5yFiQPUwSvaJ5ibw8//Ejpp1kMBI3BRfcf0TBJA344FsHzDT1S1J2/RMPp\r\nX+lfIgK/LVBPIr8uTDyKGE6fYxwB7iQGfHZaEnD8Op7vSz5Rrcr+Lxa0zNwl\r\nZEs4BUsOeb2hFvN/IOBNaX5Vr3E8YhdpO0GjOxLxMr8ZO+wQEyfE3N3peTfP\r\nQrDdbOkD9UjAs7HoH5azZ7yvYBj+e7NnbK6ikys6oDvoJ1cXAzpFnbLSOfNw\r\n36tb2UT17EqU2lbXS1qVnj8ivohMJRLuXrRIOIT1+lRVg6ENQbQhnStW1jxU\r\nwJvfBN5zU4g9DAeNug4uKMK/DBd5+lb0j2XjulBkJF68bXbkEFuhOjL/bsJI\r\n5dGdD+71LubxHEQBn3dhX9hEghZdn2Gkg8pKyNBBdCqicQPsJk8IzyTcKyC1\r\nLc7LZ1cc1dmmGn1XE8hQ3ENff32PhV852yFGcdqNXabSqdjJVESmJzns1G1E\r\nCSfdOu5Oc9AyjVV2/j8wdCKn9kRGMlF+PVgIJkzK1fNfwlqUFRDR0BnAeQH5\r\nnEdF/PieWpUpzXSaeJdGGwIzt2l1L/soG0c=\r\n=QM7k\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.0-60954a3_1673358961389_0.34173567353710443"},"_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-mysql","version":"0.15.0","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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-mysql@0.15.0","_integrity":"sha512-UJODbKHPLbF6LObfDpyvPljTuohwBVnVTiCpYjA9ZHKGmy58cM4Oiu6DsxuGwCCgnqWmE8L8SQno8SS+5qWgvQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-UJODbKHPLbF6LObfDpyvPljTuohwBVnVTiCpYjA9ZHKGmy58cM4Oiu6DsxuGwCCgnqWmE8L8SQno8SS+5qWgvQ==","shasum":"b6b2519c2b38ac715f5ec301f2f6c72c0d00ec0b","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.0.tgz","fileCount":147,"unpackedSize":221221,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH5yXbF4Q2X1hu9iDKfUIIYQH5ad99U0Dk0oxWtmFLGIAiBDBYRewVWmL7CqgWDF0538+O0qtOrNhhcKS22qXayJQg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvXDpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqQpA//clIU6SeRvMhl4IeRrMk2XxFrPr6GpsptZTKefeN0MY0+TFIn\r\nxeRfEJUD6ptvOEGuipOZqcnNovgdnHeh3X6bY8E7EkD1xPeidX0aGgwqT7qG\r\n9oRsbqm/Fs3bNos3iFazCqCM2G1JcDMS3aSctc0CU6m2Do4dqrn+puV2hZ2m\r\ny05Imv8mtbESwBMwoFugLHuUyED6+olIjwE1jKaLNs7FcyijBb4xAlBipp5W\r\novLS4cQFwnx8P45wqrtjxdh7wRaWH/tYZAeqBw7GaxZzV6585yap6ueii3nx\r\ntlgQV1Wulzjk+gxPgRhqrzxiU/Dkl/fwii0E60Bt7P/26WuGwkZ2b9rfyGrN\r\nCgJAkcG7WR3lqUKv2uLMUfOBgu+I1JrxovyVH0qTBwach8VMacOvQ6M7poSa\r\nP6Aoq7OD40l8ypoQ9yslUjgjsRTSR0VVQ0lUU0KnomWV/MQ7kjPjbuiF0jRU\r\njkVmWDIrvKoAbrIBImN6GqrmciJIgNc2Gj+aXnX4j4RvTWFqHGGNi6sikfOc\r\naZrNDV4xr+hPksCDwgdF5SrQftKMtJptD8HgTIIiaUNEygf+I2b1upl853sM\r\n8+r/wT5ATck9W2bGyZkUILVW+WvpYVONyNJAeJmSTeciWKhtsokcAKIdKWRR\r\nnyp5N8/acac83pErJcZavvKkja3cYQE7A60=\r\n=jcEl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.0_1673359593309_0.6426735795756027"},"_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-mysql","version":"0.15.0-88523f9","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n---here I left---\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.0-88523f9","_integrity":"sha512-o5RkEhUEKcRArgiiPgZvDv4yuTQMu1kPlElqtB7fdftGPQaMd5IGuOc8WE35MmAYWVvbQhURV4VjacYKXGFATg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-o5RkEhUEKcRArgiiPgZvDv4yuTQMu1kPlElqtB7fdftGPQaMd5IGuOc8WE35MmAYWVvbQhURV4VjacYKXGFATg==","shasum":"8bb1ce0c4e382088f658146013a58ad9374a0461","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.0-88523f9.tgz","fileCount":147,"unpackedSize":221229,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAeGJhBRlasDijIacxpeAtUDmt20c9It1JyBTLntuh3mAiEAyA12pJjPakNY54I6Nm24fo7Zq0UOr8K4bUENKSHQeC8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwBF1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrwXhAAkMbgH2ty+aTJCCc/ymcSb6p29UqIfZSeXNwMq+7VcOcFVTiF\r\nr7D53oK0eQjsTriLszcJ8/r3y/cfbp7kZzaVCojj/sfY2LF4Y1RiKQJlsiG0\r\n3VVBcgksMvWE/AQ+LHDZA+1ZoRZRIR39kwriSd1k76+3T08rzF1jgHjRZCZl\r\nq6Ccx4fxBuQjzB5751RnopMayF6wuKEdF9xDUSoSi7LYAS1sMsUjZ78RVkJW\r\n109ZCOttVHlv8wGBQZ4rSy9EXnguWPv/zKGa8bAYoug2gRS6kbDGew4BVKUg\r\n+agRa37sGv4KtIXFZBjdumup21GSGJyVZPCYPzmHsBpc57RA8JbecQmbp5EZ\r\nQB/ub90FUVuMDSPtXQ0/gvdFWxOf98N48o0jqIlGtu6tugVoXP7OK59zDcO/\r\nJULj1DHBZLvuU9eH/lfppwTgN9CiVepuId7sld0RHoTbWswbvF/4VcTJ7Iq2\r\niJFOb0pTvoSNgHDv8QkIPmt8F+gn3htyzgWwdpbUpPCzA5cBfOawaJrGrRSx\r\nP44TRGMzeC4kBxG35UdyzCHCLBu2ZWYyuFSeOhw7sHJmuV8LBeES1/VcyNZQ\r\nVgd07+3Kyx9Bwdu4v8O8M2etWbNa3l6sH7S0MCbTr4XLJhhuNj5bBVu53e17\r\nKBoFcCexnpV4PAY+xEnTqyglzmPuPo6E7O8=\r\n=JgUt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.0-88523f9_1673531765675_0.9092153502481892"},"_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-mysql","version":"0.15.1-f67dd9d","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.1-f67dd9d","_integrity":"sha512-t/NrAt2XxTl+1Y+FY88T+WBvMLcTZr8yO3ENv/Xz60C8O7JrmuF+ObpBHRUCGa++lLYUIfrD5nEPyyiRV3MAww==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-t/NrAt2XxTl+1Y+FY88T+WBvMLcTZr8yO3ENv/Xz60C8O7JrmuF+ObpBHRUCGa++lLYUIfrD5nEPyyiRV3MAww==","shasum":"64bc7b3f0b8feeff238818946540fd0db1f7bc70","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1-f67dd9d.tgz","fileCount":147,"unpackedSize":225139,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3DScH/v2wyhFoiX1+cLktZRmR/oDtGyLRiRT1Tbb+wwIgX8+IpJv5s66dvdMLSKa8NyM/1N1BqvFKgXMq68NpmT4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwBzAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqy5RAAjDvmm7aC1C3axGe2Sg3xSMfyGaOZg2cskEEO2LEKyNF3htj+\r\nh3ZXlT+esfZYEYKyg3bJQH/XEnMdbEpZh5THuYayYuAr9tIR0E5AxeB+mZwl\r\n0tcdURmlhtpFo2XZq1De+8BgPpPt5rTekLIRg84fTcfgTixcbzZ2O7148zQ6\r\ngnSlr7zOBd2km9ntWEbk5ohRcDza1rm6tx8Hf8VU/ylscPVb7xOZ7eJfLRu4\r\nWPYipLJOjaWWR3uKc9i5VJpTy2VKD8PGbLRwYD9X8qIJeJaFGLwGxprwrmA9\r\nBcLyHPo8EMxpEtL030NJV2Q3smbjJKWT87/tsYFcO5vITFF/+kns69wWGfAm\r\n0pnI9ISDp0Tnb7Pc/X5dzUOTdQOoXMu4mGofBXAHdlR5WKYV2RI62WkYHLDI\r\nIlR4e9O0AH3nNav7Lb++fZdZEFOyYElw5JLke5ux1SdXRuMPiomTzLIXNKr+\r\nYQSckYqPdshsyKZ+5tN95pgyXAgCWUZ5RDVlBpfU6bgqZ0dah8NP2T1p6UTX\r\nnPa6yWXaUkwn2a2ZzfqRm9/PPzbcdhPGgOk7bwXRxmNaUsuAOfjmaSwqbypc\r\nve27+Y4e7Aw+bSik0RGPlj3CJzTdi8utvxHCl+FZyYYz/EPgFHKNprkNAAqt\r\nNth3o5w3OJKAxKmxkQcTIumH3y5noqK2jeQ=\r\n=bTgv\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1-f67dd9d_1673534655902_0.7644664066553595"},"_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-mysql","version":"0.15.1-80901ff","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.1-80901ff","_integrity":"sha512-mNCQcE/1wIn/LA2SXNikJPkeUaxRLYhy+6wBxQ6AX7/qrNfe7Q0H+u568LI2I+8lS+0bgGO/UjKjrXlCFJI5hA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-mNCQcE/1wIn/LA2SXNikJPkeUaxRLYhy+6wBxQ6AX7/qrNfe7Q0H+u568LI2I+8lS+0bgGO/UjKjrXlCFJI5hA==","shasum":"94c18de70efa9939726758c41a14948def408b43","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1-80901ff.tgz","fileCount":147,"unpackedSize":225139,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIApXTcKx2AWROC1cejUl0SPvyyDHy97e3o6CDLGyLINMAiA916AIwwN0koLUucjIU+hMlphspqS1qPFNF+SEHcHJVg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwB2AACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrzsA/8D8s3RXOGgcypa3cLudfALH5urJNfUKtimukbQGbl0B9lG2+h\r\nJH6Wp+ktONmyvF9vDh2Pn2I/enRfYW7y9W6eWIcDTyL7197o1BOwioXWK66r\r\n8FbBv+V/15RS84u8cXDBli6DCKICpJkX1DrEx3tundEQM5pllzMr7Wr1mUIb\r\nvWFTyJp2T5HX85SfaUJ5pCyNCRiYjNdT/Q9dg5iWi8HknTQQRWBUdZntVGMV\r\nT6RyRZnObDLrvcBvxyZkdKxjGIUjybNtSlYshW4M4UpXrCYpuoXxPU4FbBHx\r\nNqq2tOxaTD2faRPFhGISUhx6YDprgWNXf65hEIrFfFQDqcgFYxf+/OK5+Ysa\r\nlSZs1a+1h4Lf1J32n+WmIx7poZUyMi9Ox3TCqbT+zMf9eZ2+ukQJh0AQJLgC\r\n02KKIiTvqC+2ImMpg/hFYvAdAycVzwOdUvh3TK8+cjbrYMA145SB1wSZgXFo\r\nGr0gNQMKibeAwyxyMqCzWXr2xJlKTg7mYcsvlhauNTZ+Bp0cLdYNKu27olaj\r\nFUw4Qc2r+wcvqYcIt68rxea+usX96Cm+TvfVihWOXLQv7UjpyMkKKWDm/KTm\r\naAWgX1+Cwb6i9EI925aLQJfpDGOwBExiwqnqZEUaoRv7M3d1O2hUbtyiGiAw\r\nVv7dewbv5MYW7u0H1kfYUdL/sYV3u3eK/24=\r\n=Stgn\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1-80901ff_1673534848428_0.035120278680868644"},"_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-mysql","version":"0.15.1-4a5b2e3","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.1-4a5b2e3","_integrity":"sha512-XqELDCnUIGSawcqQ61NX5Zx3jkCm5ZvVBT/87stn9ZsXF/4aK/QF73NxNRpQA5q/C6HN+GI9dvLU6syiBTau8g==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-XqELDCnUIGSawcqQ61NX5Zx3jkCm5ZvVBT/87stn9ZsXF/4aK/QF73NxNRpQA5q/C6HN+GI9dvLU6syiBTau8g==","shasum":"47b8006cdc038c6f0f7406ec6c066aea948d417a","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1-4a5b2e3.tgz","fileCount":147,"unpackedSize":225204,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDjORe2XzPhEuT4rt7i5nkVHg15DeTS1el7WSZZX8Eb4QIgbifx6UAc4+1NOgetwhvNwzak0mUbc7TFHyiePlMzz0U="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwC4/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqCEw//ZhqNqY9C9gdKObtn5WlmVsqHaesOwn6/iMz5PqiDVm2ufsQY\r\nJLOXNFtHJv7Z0C7alRudwsRI8GhGH7PbB9LjF3l9sNYlrb7oP629yHbYG+Cy\r\nZHdRABI9kg4IyqtSosPSbqQWJjhl51Q9oUTnVvGOQopUp37iYHgaI70hjso7\r\nzeoXyeT2JRciGfKxyAkY5hhouFTWyDBx4Slzkl5JJ7CA5lxonZv7E5k+fgpN\r\n8koiOOXTz0vzXwdU5r6pW9UD6cVNiJ8mSoy1ycwhOjj+nuLcDhxodj31dRd0\r\nqILACQ8uFvu1YdKR1OGR0YvpYBvc/4ZZxoTltj/O+pwMqLQUrTaVN8hpu/xL\r\n4o7zEUrqvAEA+emUmM6Y56Mwz2Zu7Pexo8G+j6dDKjVt9tVEKPJpLqDyIZ/E\r\ngaBljx5Hm6JvBX9Ry72bKWG8goDks2nUI4gUdM25l8YQYEWiRX4tubY8G+oi\r\nFtomkyUw0kL/OU1qh1HBxwyun6GNSmqiupnOjg6LbF/XWWEcop+/G7E+kNu+\r\n7EQLUCzufCpRJCsgSdHWyYsDYa9XfC2fYs8qa89pl1nMopJNCZwjQT+27Ydo\r\nL1/M5WHlNn2c6DwoeXGevisvM5utABIS0hjg7+Em3EPetk3UTGjxuUKjMPe1\r\nDrz+8Js9lhXKGf/qO1gA4K9CknL6FUlcAiE=\r\n=VHms\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1-4a5b2e3_1673539135468_0.859718886187969"},"_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-mysql","version":"0.15.1-9728cc6","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.1-9728cc6","_integrity":"sha512-PoQWeuK8LaGT2r2qxiKCpTRohEA94cHtDvW66nUfECyveGaoSj7J2YiRdOYFR8LXVdJzUBM0ylPMmRIKscRfEg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-PoQWeuK8LaGT2r2qxiKCpTRohEA94cHtDvW66nUfECyveGaoSj7J2YiRdOYFR8LXVdJzUBM0ylPMmRIKscRfEg==","shasum":"af2fd721b93d535324bc08631cc8c1de87a2acf5","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1-9728cc6.tgz","fileCount":147,"unpackedSize":225204,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCzJVq2Q9OuCMO4EukBfwzBEjFmexSQMDXWlAWlwCWUbwIgRRCo7tflnrWXdLkMFkqvZ44Od44Nw8WO0sznuW1Vcok="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwDbPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq+Mg//Y+7fLnGx4YuvWGUpUx3j+oeu+KA/x201XG5BA/XMW5AXxBpn\r\n9wy0zDgrO/j9KysWbQ2M/pXtiAoOWc3kYppS7FBU/xQgn5F0g5Th3Z5XtNO3\r\n6yYNbnnpUabkPZzcwRZ2R3/GGHRcEW32q8DeH6cTqZdTEq7YO7fzBVWYytZ0\r\nsubqLcDV2f2Y/hfrF59zRwaphN40ahx/dFCgdtz/87uUyBYaZ1Mh8ubNcR62\r\npYRBXS1b+lxxauklepiVaXvuEMpkB1E43Qtj8VkS2FCkDUyw0UmfZoDI/f7t\r\nrY2xaEG/Hsvp5jgoQ3sqXFRFlkh13I9mROdwn29MP6JHoPL5JDgHdauzzXh+\r\noXE/T2aRcShgxziIHAbjHNQDiU6m10HKjJ4u6d96UdWqjycvJ8E48cnBKtxC\r\nfqgEGuJqQE7jizCacvA34P3B6sxzXYbBLcbGL6PJ9ur6CQ4NWkmoMgcI8++Y\r\niMBhfFtH3NuO37j3LU9eiiS9KmB/WCunBZ5rQDUf/zG3YSojAN8S10MrZ5kf\r\nGFiBJDOq87lLUlocFlYFw7AvH7PzyNl121rXO/IeV3Iwi66+z3Y0/1q8IceJ\r\ni+TvgtSoVml7YTDop0Kpsytd8BteE1N6smT+6jluAzr6R0UnrW0jzsqJPEi+\r\nMFYDkLMMo/UtOXSR5eMTYgSMMeP00ExRwAE=\r\n=rBFb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1-9728cc6_1673541327706_0.16291991676809725"},"_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-mysql","version":"0.15.1-19c5c02","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.1-19c5c02","_integrity":"sha512-HFYzdzqqJNO/6ySinVcF+HjuhOZ4y4xvG4mQWWc+4WE9P2aVwTclkZ7wdzH9u/NwAJF5ej4+B7hawlt125b3AA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-HFYzdzqqJNO/6ySinVcF+HjuhOZ4y4xvG4mQWWc+4WE9P2aVwTclkZ7wdzH9u/NwAJF5ej4+B7hawlt125b3AA==","shasum":"e5eaec661bc646823c90349a4fc7de1a4f011e35","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1-19c5c02.tgz","fileCount":147,"unpackedSize":225204,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC3qwZMhGf1glom5CUWztgZ2FM04mx1fvYSXk3MVCBToAiAFGyJv++QwCymupUF+MDnXTniSiOHDkqEBTkd8BTqzRg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwDnzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpncQ//ZfgZ0fnq3TFbJXthPdtdokuMstaaT7o+aF8buBo0/Kb4DSJU\r\n494K2kg9QOORMC8kOHLvHMzHmr5AC7PTh3ILioakazyoNh8A5NJhtzPq4M6x\r\n7Xu8e/zcCAC3n9mfgYz0Wmy6jQ8LSN7sAkaIjkObCzzO5Y2GRLSDSTFbCD+6\r\nfDr33oOx8SP4aqAn/NgzRZLxdJwjmSaFoLcaF7uu1HENZ7+SYrS96s+Zrtly\r\nwlMEXvZm9PFtxjTSs4vIDVj/cpGB01YxpGrLI7Ys2dFRo/oqhhV7y5MA0SjG\r\nHS0g0cLKSfM7O+KsLCrBdb7rRE764OXLOKBDK9gE5T3zVXYErnNdCDYPqXN1\r\nxs2fnu/X82yAxo+BBa4EfOV+KUK71vknE9T0AJAL947ab3ye703HQ4pCUOav\r\n4HW9B63Q6tFn2SIZ44M5EgMXYmoeQ/ooR//2K6om7Dc1187KlBK2eKyIN+i4\r\nGgr8ivM7pdMZGX1GMJ5SLvTaZDp68hJaAg9mFC7Re8a/YvQfK6MVUhHnHLhc\r\nNFE927vJ8QXOKwox6Es5aEr/BsGd6MFvuCOBwhzrgWvkMbmKw3hsknGrztKX\r\ny11Kd4iw8Tt1iB10iesbVcBMLjI1mQai6xR3XL6kXADk6vGD4epy48xR5kPz\r\n1O+1jz14nT1OuD5lolT0Da9GXApwGJj3O+w=\r\n=R6xj\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1-19c5c02_1673542131606_0.9563840360679128"},"_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-mysql","version":"0.15.1-3548c99","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\n\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: popularityEnum('popularity'),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nexport const popularityEnum = mysqlEnum('popularity', ['unknown', 'known', 'popular']);\npopularityEnum('column_name');\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.1-3548c99","_integrity":"sha512-HwHlFRx4gHsZKGvU13KvgCH34H2Hv8mR4ZKoEs7iuaLSy73n/FN5CnFSON23eLE8/aTB06d6A7OrvtNrPLMiHg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-HwHlFRx4gHsZKGvU13KvgCH34H2Hv8mR4ZKoEs7iuaLSy73n/FN5CnFSON23eLE8/aTB06d6A7OrvtNrPLMiHg==","shasum":"00a95ab0ce04241e6f6354ef3e101e85e82bfaa2","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1-3548c99.tgz","fileCount":147,"unpackedSize":227308,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCi7kqH6S2wnGJfaK+cOIoMpm0oRwXyFDx/cuk+cyTSIgIgZq3Atl+qDax3B3mXhJ5UCxTn/XSslrOeaihRj+iU5s4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwD//ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpUZxAAj+U/uwg6LYwr7nXAbD+ZMLSxtGaFEADi4NPcyp8NpJeMb7uH\r\nM5dessrYUkx9Fm0jAarHFfh1KdG9f0s2o9P20AIuHUwbgX37WdFLTS5e5W5h\r\naSI36qJIWD8SVNXLJDINNz4iJapR/KVkdU6y1a2/Q4Df7ezsZCDHkCEbt4hi\r\nbiWPGgA7k9I9NspSmxrkw6u6ReQx9AmZdx52jn1T1T6lRR3Zts0TOjLM1wLG\r\nE2QV91N4/ljl6yfxOy35H++q+I/eRuurbUzAWSbycGJ9KhK0/GEWiqjh+Ocp\r\nQLqhdTmhZngwcTgJsE3fQ+mcQKK67mAKshI6BD9hn7/ubXKx8jPiMbGhrqhB\r\n+rsIrEbZpCDCxUyqRTvjnfeBsdclzGqKvhDheEz9Kd9666SY8jxbC6PYi+vT\r\nfxxcOLavfaFRxBQSHZf6R2NZfrazzxuWmpFYTUwfl/pzn6yb6ruViGUhFPO5\r\nO8KgZC3h1RY4w0S5lM+XvsTtUUNaGjc1scNMo0SrD/jMwXjKsp+vYW2TKL3c\r\ndfuaomLYpznEjjKc5WzaEhNonrBgxhSPpyWkburnKC9u1jw0t85NqhC40vbQ\r\nc/Vta4tlo4k5jd3TbQNeFjp3K+1sU5k9QOMjxH7q9yyZ//lIhZQf4RXTBqlT\r\nS/bcEIwxSvnoGwm9MS+eFCJaUz33e9XmAe4=\r\n=5lEu\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1-3548c99_1673543679518_0.7407548582116927"},"_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-mysql","version":"0.15.1-a1b76f5","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.1-a1b76f5","_integrity":"sha512-9/3VFUi8A1kpgUu6PQ/idDfUDR6W0o1D9SyKzQIyOcYVkUhfAHcc9FvLbCjGq3UK1fsXUKNCA5sFMdsQ2Pk7xw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-9/3VFUi8A1kpgUu6PQ/idDfUDR6W0o1D9SyKzQIyOcYVkUhfAHcc9FvLbCjGq3UK1fsXUKNCA5sFMdsQ2Pk7xw==","shasum":"5ad9ca1f730cf110e680d938829b9c1caafdc1c3","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1-a1b76f5.tgz","fileCount":147,"unpackedSize":228027,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9ffz/IBdFKV5rnIjgyCrNbJncp40RThmun3ovgBRwugIgOINffm+3jcl9HKBaLJzPxKbP8XBczW8r27QvpQmsGTc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwTPOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpdng/+OL7YsPZRlqJD9adaOyzJDwomEr6UL+TYNUls2E9BoAqEn9RG\r\nJgPNOUvLSuRKqIsQbRHgzgDVs4HKpkqVr9Y9iJe70sN9Z+7NdOFnjPTcMuGH\r\npfoH1m6X6JZ+bDPXkQUSGwmLGnLt34Ibe7NDlD/PCtU5L43mhkWXznqTTS5f\r\nWvVqDHWR6EBExvWlxFiZrguLo/dtDjdwIyBkxOleAb1+dc/Zsx+RcwFgARk4\r\nNMUoAA0+RxsuhzaubaJMWyMrcw+7ScUz1ZDJXarhuoq+PUWOnOoyIt/4qCuL\r\nFLGhCVZ5lx6Gl97soYopK+oJzb1C7i0+QTXgnKd7tVq0P3iBh7V7bXz8H/Dj\r\n09DfW2dil0uGauZaA7+TW5xcHp4BT+2IOsOIV1y9TtuO7DAMJACrgPANsalo\r\nbVPhgWlvn1hHKo86BkhwsFTZD27jkcxjbhCA3YcfuzpBRwQAkkPBkBLEvaZC\r\npTklEO8xdrC4qNn1B4dglxdwtLxrV4WWAwnkk5OM2RRR2z7d7yTnAgvNje90\r\nFHQlDQjx7P1f+2oVVU9bDP72CIWKhbJZoGxRa6Qv9H5tkVxRwNqM+iDTlQZs\r\nTZTRtOqRMcZZdU+N53V3f+olQtVykyf5iOSSCLJAFPp7Zu1crx1ytR7SLSBk\r\n/LJXRusAz4gZ4V0ycvbE5Yc/Gl8Ggu2j1Qc=\r\n=589C\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1-a1b76f5_1673606093980_0.7108941655516026"},"_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-mysql","version":"0.15.1","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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-mysql@0.15.1","_integrity":"sha512-3jzX/s1kVPG6EsvHb4pXsBZRWy7r4JB9/VyJLjYFlyIqNaJCP57mPDgoDvpRNNH7lywucrQE5qiNDlIxE+K7/A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-3jzX/s1kVPG6EsvHb4pXsBZRWy7r4JB9/VyJLjYFlyIqNaJCP57mPDgoDvpRNNH7lywucrQE5qiNDlIxE+K7/A==","shasum":"244256c320f23e157c79aca13cb6208b4b7faf42","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1.tgz","fileCount":147,"unpackedSize":228019,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID3nVVsEqt94wlV0z+lFWewEZdu6mzbOsurHPbbFlBKaAiEAvaPjCs4rbvZbG2FiDWshm4m8AmpX8NDvlCvjugCIV7Y="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwUnAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpw8Q/+IO+BB6UBbo9Sv08h8uNcZDOgzdiir4aLC+bOgEEr/MBdDq+f\r\nsOL8vVkj/Z8ZMp9iiB0NHRSkeJCdW2BQlI++s0wTJaEbuUSMBGC3RrrO9sY3\r\nEF0QtYWo9JeH1qzRJV3hcv6zloC5TXV7Unb9NJD6mufcoltxy0UAtrn4Ncbe\r\n3qdtCGskltjRuXuy/q/JYhQiJrUCorqTF3HY2BrAzDjPsUTcDNV+OnYGave5\r\n78D5yTTLVH1p2NtUSogldP1nwm+NC53YrveJnAcvNLdbdwo28l5lTyET8dWp\r\nRbLHoM5ef+8m7BDhkPMYx0wDLWrUw8IalG0P9jYHpKhNC1V9YBZm9yMqFeb4\r\nvcWqK8AjXsWZzlS/ODhhDwTTSwgsnPFLzN0Ah0Cr8no5rOaDzCREu9gLCr1w\r\nVPRzK3f+99yllNNbG5SyLYVhD6d766TjyPcCD619aoD0D1Y6hgeurmMJO6s8\r\nytCLT1aZzetGFaMsAjLUqBX14xLi3WEH9QXtWMORye0fJ5GchGNqWl+aU9AP\r\nE678K6Jpm9CGxjqY5NMQA/q1fpdn/BWvi2/O3E9Iomf76S1KzGgdphc9X+n7\r\neQxq2Vvi8WIjXq758xeqPkQwNm/ikRq2uGv77pOffOAdskdzo9E7uUYnJCx1\r\niRDma/UCpC9Ge1uh8d7nV6JbS07tqHx03bA=\r\n=3wV0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1_1673611711892_0.9893210184463082"},"_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-mysql","version":"0.15.1-656bcc3","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.1-656bcc3","_integrity":"sha512-Cnh3YTenzQnmaCJgIp1UvSTq1WOw3UsmLa5kvJofVeYSryF0cyVv+wvufZ+2m1X8k2X/fFMW2m5Ym3fMZEEUpA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Cnh3YTenzQnmaCJgIp1UvSTq1WOw3UsmLa5kvJofVeYSryF0cyVv+wvufZ+2m1X8k2X/fFMW2m5Ym3fMZEEUpA==","shasum":"9f8dcb6f2e8e2b49791ba099e444d7d59003456f","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1-656bcc3.tgz","fileCount":147,"unpackedSize":228027,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+3hSnnlrPLMvxnu01vLiAGS8/zftje/P2tw/wPsBNTQIgWbxc0A/Ma/WGD2fn9LsN5Y58atUaZYmnpBhIiwK0TU4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwWl2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrZUhAAkHsVJb8osAuhynWS2K8i/Om8ld+pl4EhJLZ5abxiMLQXNXVH\r\naDfk+cU5vqcE8tFoVMdE6muTo7dHVMe6ZDTtnpCUOCyaxdQ8fmw6qHbHUHDY\r\nS7rYfqvvcn/eahTQZ97m3r/k7GcInhKwrchjnBYjyOTswenN3+pt9JOM/Jbl\r\nXt7wm9ZLjsG3YU5HwO0MuDLFl2oCTV/0NdSxLGyJDXtOLHakfAIEsxxcCYK+\r\n05EygZ2C0lJm7J6YYMMd8B3YunHJMyeDlnJDhdtBnULXHZmIdJJvrl1WccA1\r\n0HjCH/ofipSOv9XOY2AAjk7fBLInpzFP/0KQjh4pTByjN4jkSpfMlo9KD5vu\r\n4hTPpY+Z2r6/scUL9NNoRbK7koVTqbHUzKtCZgIj1UJnKeS/tnWb41HQu4lT\r\ngWbGU4BT4+d5ij7A8zLIocnabzHneo8hm4dGDiUW5jejyDCuA6LSzp8K1OZ/\r\nv1kRocAX2+SJZg1l8JePOgcNiO6yV7KSXyu1rLdRBmI5k1XW8EXde/5pCIx8\r\n6tKroTIwY4a2MIOswrE7GR2NVGFqlKXyyUrBC4pch4dD85368Z+nWX/fdDVT\r\nv+S9YoCVBMkgrppbctYqBoJFhvQQZUPmW0KD66WZ8eKCY1LYXB4tM2hT/c5f\r\nz2F1Tj134BXTmAtiz0HUvkRPemGWooFFlww=\r\n=rxbl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1-656bcc3_1673619830440_0.031686611028600264"},"_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-6879c1d":{"name":"drizzle-orm-mysql","version":"0.15.1-6879c1d","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.1-6879c1d","_integrity":"sha512-rkRlaNF7uWVa/Rzip7Kd5cHwaYXqgZ9MnK4bd9kTKLbbDbMpJ+YsHtSn75KWyCkiQDG2VPW5dVa+5g4eVblBDg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-rkRlaNF7uWVa/Rzip7Kd5cHwaYXqgZ9MnK4bd9kTKLbbDbMpJ+YsHtSn75KWyCkiQDG2VPW5dVa+5g4eVblBDg==","shasum":"7d9df5a8ab96d2f3a2b0ea2cac949da1aa7187b5","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1-6879c1d.tgz","fileCount":147,"unpackedSize":228027,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCGzraCxb7UzFLMOErjO6qHGRDFlliz2/ZOKqWRHdyxHAIgCRdmPpehrr7U1GVl9tIXU4zF7E6DykghiKKGov1q574="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwonCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqYeg//VAxNbOLORsDRlG2RIgZntH+R3+a6w5gkq/5pRgCYzbEJWoGu\r\nC9klpxrfwFpIJJx3V3aJmo80kqHQI52cuvNyA76qzuUI/Ufy3JVQsGUd5Mj7\r\nwuZUGhNHyHmfHOnVFvP1R/txcBjIsjJCaru3sEVT3czgKFG4UtEFcGra5nDf\r\nFLortdnbjhN7swfPmnuJ6QU4/8zPJ8ER+xwFUF+mxNdemfssV/EqeIhG6peb\r\nx+1IWHFbjktvUMBk7D+Q4zUrC6gfwHfBWGSti8atv1P5hCBlVhJrqLQMcDdS\r\ndY/xGSEOwT7POM/JAPA4Ymm9CRFHSGnx4pl3zYXjFqVPVu8j5rowR5DoycHL\r\nv0SYJqS6wwVdYDHcwcVm/L2c6f+8yrcYZAGqRjEiRDr74r8WHbA6nsXK0lBK\r\nKVEHQ/LCtEQZ6eTuNE4cH2IFo3/QtAL4tilnbSiGGPDAECi5ZQr6842XDwo7\r\nbtp/Xl4x3KDEvjbEWIYEwEOtkLm6PJLLUi9vf6UB0VT/wrwQHLjd1Np6bjHS\r\nxsoAzD7jKPv4jx5SmlQyJv7Nf+nkaOUyhmnMf7/tnzws8h4duBuowGD91MAx\r\nGq33PYGRXcljle1/GC88so4dc3tiEt1+vXbPgdqziYSdAglp1SDJXq0ctq/s\r\nCs/kdMQ8vsrmzFHuJbAgiGcWjUxPA8xozFo=\r\n=yOsd\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1-6879c1d_1673693633844_0.716549760369932"},"_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-1766537":{"name":"drizzle-orm-mysql","version":"0.15.1-1766537","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.1-1766537","_integrity":"sha512-074uSyv8jk1fDzO1EL0g2FNrHCVdKvJhi0dDnVmh5sCIpC5Ofn9JpBmJTbFIdogT0ayvT87lwshTVB+3NyDpsw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-074uSyv8jk1fDzO1EL0g2FNrHCVdKvJhi0dDnVmh5sCIpC5Ofn9JpBmJTbFIdogT0ayvT87lwshTVB+3NyDpsw==","shasum":"e79d9066d333b27c66d83a2c59a843ac7f873648","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1-1766537.tgz","fileCount":147,"unpackedSize":228027,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEimlFQ63pvVvxj7MuLNmQthhAXJk28fblXN2acgu+tAAiEA5+DmCAqIC/0Us/Ph789QwIsBwzBt3jWp0yqaebiut0s="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwpIXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpaCw/8CJU6cg6INNP6BcYNPTE73k2/yvW4fTs9EeLzHG5ZTw9jee9M\r\novhr2zpMXDeCs6exbjGh6D9tD3jaUMPliLMX0v/I6eATJ4hhdl67oFXcACoV\r\nwiJqqvKa1KMunoTBi2DiHD+LhBup17CddZNr+K+7LmtViZ6+wZTOlJeiRyzU\r\nuoalcmY2BDmGGCRyjZy0j5PCIZWB8/aTKq/P7VbfXF8IY3MXcazZ9HC18dvh\r\nIeqyl2WzneWekgj2dKvkvztFgvymfE86CfANPrIqInjtkItpfOIkRkZwhRjv\r\nyooGVQ04qwjG+VNz0zalPdjBDDu+tI4wp1xS2hiZEKZwBYpOVapFX0Kmt3HQ\r\npsQFsgdwgiE7SriKmGCLPZpgilVbKDehUv3SWcd1yw9x41hJJxRzEwrohIb5\r\nMD+MF74Ze4wfawk5Eo77D4Sm+julzHw7OfMfeMX/vY4/zQphq/yzBjPZNW1k\r\nANtLmwmtHRne8Y8h1k7fa1m1Idy/M1awC296WOrNn63aFj+TCDMjsS9NVyDY\r\ne/iqzrdfQeptrRJ203utiA21FWBx7vAVbRi0PyldVRjoM32wxyLrkZ5oULg1\r\nhuo7hc8X7U93ZyAVuZFPd+T/kdYS7ydxPVZQ8QagopZ+IYUvlpO98Sw+dpIJ\r\nLXa3A/Mv0QW6HIBvfc3Vm348g5IlytR2Wfs=\r\n=uldw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1-1766537_1673695767775_0.5735371988500118"},"_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-2b4d90d":{"name":"drizzle-orm-mysql","version":"0.15.1-2b4d90d","description":"Drizzle ORM package for MySQL 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","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/src","mysql2":"^2.3.3"},"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'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.1-2b4d90d","_integrity":"sha512-rZ9Illo9m4iHlP3eodrBmWrfoAqe9nZojbXmbTqPY1SNOrwCVAOJu5I7w1Ep1RSbDhnwp8+mnHSWpLgpThBMzQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-rZ9Illo9m4iHlP3eodrBmWrfoAqe9nZojbXmbTqPY1SNOrwCVAOJu5I7w1Ep1RSbDhnwp8+mnHSWpLgpThBMzQ==","shasum":"a27bf05bcf820dba2f27d65fe714f9f41c7e9ec1","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.1-2b4d90d.tgz","fileCount":147,"unpackedSize":228027,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEIodhHj5QcXUHZYH0HTGEn3Oo3+SV6H7bgASOLAkXaSAiBvd2yQgUUni7A0XI71D3ul3lMNLdslSlI8A22nz3EXAg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwpa7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo7JA//dXnThiMuWlV8sqUgB/NCg9rExXF9QDksm+/Vj6/WxALHER4k\r\nU8y8o2vtdtqyF/YtIV2ngzdDEaWV0RFvgu3Q4vD3WdxckgLbrHx4cijvdLDw\r\n+AiFY8g4d1kVQzlsxIlvY7wT4PRVfUJYrDb3qRWiAhXEFvv04hZQxlugmYXt\r\nnxrjL2xwI32xTcgXYO2jJyQGP3J9qB+0j53h2TSkzmjvGbD1Py9X/9ewzbI1\r\nogbsS1nXl+lbSngkIfxU6yKJTSsmUwMtrjub3LVUnUfBLmGIlBAzUpYsTwaI\r\nGkjy1seMQuCWcnym1MssvekNyHtUOtDJUbxqktcFm7jCcIHXUR5UYwoQ6rxW\r\nNfKoJFNWfezcgwZDNl684fHXEXOtCoB7uU2tnQjUfh84e+QFLLkTq5Qm8OrW\r\nXoB5Y1Hgwn6ZgZVDzbk0UGzj9v5HDi0vUObbvFI3CKttt9okO4Cd/UbDSPBt\r\nu9C03wydnj5EV8foZXtL/ryKdkL+IHlBvWMgrOI18B/9T0A6oKjvzrb+d4+o\r\n838FFgKugtICf6sn3GbFCstgliQqpbtneKVtgWs1e5zZtcV3gBTOyZWaF2Yu\r\n0zehY8QM/laSec2wCsqrEmQBjwxi+C1Z0oM1T/B90YKTf1yWSKKYAwhZ0IMe\r\n6vSoCwPEzB+S65M4V9dox2HvPS8kShT9QgA=\r\n=tICF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.1-2b4d90d_1673696955443_0.5410983944471188"},"_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-mysql","version":"0.15.2","description":"Drizzle ORM package for MySQL database","repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"(cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.2","_integrity":"sha512-PT68MYtm4QkZpqgHkwICVnhpV8oEqQzesIBs82AXR4xZhJ5UxqzDKO1vPS8bEcCXvGjwpjoBIIFt+eGo8Wn6cQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-PT68MYtm4QkZpqgHkwICVnhpV8oEqQzesIBs82AXR4xZhJ5UxqzDKO1vPS8bEcCXvGjwpjoBIIFt+eGo8Wn6cQ==","shasum":"ce5ba756c7896ad8470e2cbfd6004410f565d8f8","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.2.tgz","fileCount":195,"unpackedSize":292959,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDfWqzXdeDCCNINPlU+FSRwEboP3ipuXnoHFjPU5PWXdgIgFmddARWIJcgnNaoWp/db2iaWMoAlEGsQ78ZbzfkbyrY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxVotACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpRBw/+L0jbOyG8FOLbumm1iCeTE+tmK+IVyYllyCYHJow33F8usa2J\r\nXAFDjhu7P16mjhEXVtFz8tRdrw4bV5GmPyGzeGlA2vATcjO6xbS8jw4Jnfi+\r\nKylTjYCGBNIhZ3CG1uT0HLfM8PX0UarKE9yu//O/W8fXfIL+OG3t3PvZrXFe\r\nHBIMUsacLamsjCmUGfOACiFb6hMTzlQt+UJQdXEtPhWBtn5T4gXZB7suyNfU\r\npO0AArRGJv4171mvGledipvA72PwS6momm0UOrGo4yb+FP8pLyGZbGwsSjVT\r\nJhspMImJ/AA3oAXMJ2b4rUgTuMTf6nl8T6mGg+YYLrsQ34CeiLq4dF7Le68O\r\nwMIzr0jcerfMMofqp288UBXuHpmBBnKRFvrcxgbOsU45q9VCuc28TbwD721R\r\noTk42rBwRsONqikR96m+IE7bAebDHfDVOCjG4dVO6i8/LyBauihm+49LY9ly\r\n5KYPBp361NbTH1d1yHhmen8I9g0fDqtlGk5IwP28ESEmcZrYtD5FmBhiROlE\r\n7T2V5c14aDGyXPiB8rmIVS2AmaF3eCSdiVW7nhM+eaJKME/oMMkPKkwX+9Oj\r\nmtZ5AzCSUaIz3CLjxmgC4QzVoqPCXJvHFuBZgFmzDksJ+9xpzkVy4kB2NkZh\r\nLeNRP/WwwPbf6m8dvO7ZkY7iUtOLS4rwwWY=\r\n=Gdt4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.2_1673878061331_0.010217108317063905"},"_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-mysql","version":"0.15.2-52e75f5","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.2-52e75f5","_integrity":"sha512-eGa8/eOG3L7RTpg94LJbngBlseDl+EUNLFyuVuh0g11Xaad5DJqXvapUOq6wMODrV5wI8I5UrmUa4D4Ux2E4/w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-eGa8/eOG3L7RTpg94LJbngBlseDl+EUNLFyuVuh0g11Xaad5DJqXvapUOq6wMODrV5wI8I5UrmUa4D4Ux2E4/w==","shasum":"79513bdbbc32b87e49222cadc95c9e90edc14067","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.2-52e75f5.tgz","fileCount":194,"unpackedSize":281462,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFNrKvLS3ZYzEVSjFJKTs8odqhfou6Ma/W8iFXN2TJFQAiEAghSny//i3/LqQf2DDHjlyvsF5CtYeEwvWTuDlNoE7Qw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxWHyACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqrqg//cpbti8uXsa5TtOhQXtzTrOXt5A+AEdw1uVK/G6fWgqmbwRCd\r\n8OMZCZEL7io/KP7ygWti5lfaCWCti2YAFkLnlFoLXufZMJ98ufjALm1ISix+\r\n1P9Y7p3ClGC/raZ1KRY2cZ+vyZlDbTK5Nxqotx4lXeyoNtGGsyHsNCh+Bv4/\r\n99rEnKgtOmVx0lZO2POeq9fLjYdQnmhxrfdqeRa2ZkS3r3byZZ2HmfFqUEW9\r\nZZPqtozQhJKgbG7LXmD6D78mNNl+hE8Fu6jvwNKEp6wXK4lNYBy80M1PZf8/\r\nuoHSJ3d3OZff6VudeZXrPtNFpcMGoIdQL0FGaxPdgHBLK6YL7hfgUjRzC9KO\r\nQ7wqjhJ1Hr3UyTuIPMXkg+5hoRxsfxA4plWofXappuVXjwyyZ/wIjMECOWwl\r\ndadwYH9bjyZebzwxxOet1SyNRLQyTxaTVd5iL3d/mIO+5GfTttbSrbOLxNA3\r\nm5Vw5D9VkxrN02GKUpsa8hGWGcbeMFZ3hTlreWpBg/ZbevQar6EJEMuy/yKj\r\nIq/xw9OtAyUJVrWUpWhNPC4Zga+cICACCd176/6+dsPn4RWuXdKSY2LukOxI\r\nmpMPXs1BoHUyNe1MRilZN+X7JmP3g/wTK6wx7VCJqw0NxEYado5rmxOYW+0R\r\noec7p289hOmEATURG8gnK9NNRLT56ghDgwI=\r\n=DgtT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.2-52e75f5_1673880050585_0.8626905601863819"},"_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-mysql","version":"0.15.3-c675dde","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-c675dde","_integrity":"sha512-Guao/CNj+/bsUChKIcSrcP3mefHlqNDYW73cwiH95F2lgRt6pyDvt+p+eG3U73EkuZdgXkjaBR3zoSihYrec/g==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Guao/CNj+/bsUChKIcSrcP3mefHlqNDYW73cwiH95F2lgRt6pyDvt+p+eG3U73EkuZdgXkjaBR3zoSihYrec/g==","shasum":"eadf651777caf92a90caebfd5992ac49629e49a8","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-c675dde.tgz","fileCount":194,"unpackedSize":281462,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICX1x3hEiAtn/zrsomrrnepq/412673Qz46B/NXeHY7iAiEA4qFAEGc8Fw5LsMssmxra09z/g3JQPRKqqXhKl+d3iJM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxWWYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoBoA/+NO8H2m0NZXYMvXulag7BjLjG8TdNz4xAroyDJzoSCj22cdY9\r\n7o6a9q17MPMPHrH0MBPpmCsfiAJVCpjBUaab6q6no92JDf58EEThyw3bXC00\r\ngrmCx7mV1SpX3qi0YGzyGaKUxBnoL/algIm9yITg/wne271Zh8S0weE7/I+s\r\nN2GiCCsqtxHNbI3xpxUpX3nKnE2YUADEzXwjdNPQwSS4h2vPkwBRRsst0Pmo\r\nBjuIVwDlw7AezEfyp+jR1bc2WSnLEquEZ2++tubK7h4LrVD3KHEgfuZOfcTu\r\nLUTcBuFtI70fEPiibHVjMdWkKd7NQyyzvN7gtony6vHdgxFZmJxWRptjJg9O\r\nXBqQcp1zbd+cmyZOTAKlTuyXxV4x5+JBcy3SQJKW+Xo0CbteZ74yKvNetVdB\r\nqnkyEdpX3SaNwqlYlj9wJFNHlIAnihu9njzuIQy8ze9lmySt8zTVmJaRQFOo\r\n7W0RACjuHS5EQc249h71ToX9b03neQJP0G5s5hTtmpmLyeG1HxjzMsgaRr4r\r\nNOCN6oKfkUN5GBDIj+KbUH3eXxVIAZVXO6STT8BZ+hPlJQiPAdQ0IV7b8H1F\r\naU/SLhDF7Z6j3QTdXcKkSXxPvkmaVYXNnIb4JhoiX//jVxsTfYyesVa18dXy\r\n/8ahduW2xmGfQLIQKgHoJADlGRBJ/pcs5lk=\r\n=HdW0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-c675dde_1673880983768_0.7287799803797486"},"_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-mysql","version":"0.15.3","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","_id":"drizzle-orm-mysql@0.15.3","_integrity":"sha512-dL0TQbiQxjOTXQ9bWYZIlYq4AuQYEQtmu4+pr6RIk/BEjUzygC5KodCde7isbNrMqN8HVt7Lhy6e9eKZjMoDMQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-dL0TQbiQxjOTXQ9bWYZIlYq4AuQYEQtmu4+pr6RIk/BEjUzygC5KodCde7isbNrMqN8HVt7Lhy6e9eKZjMoDMQ==","shasum":"80fbb7d22baa58eb549847dcc267218258c01d8e","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3.tgz","fileCount":194,"unpackedSize":281454,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEjdIndPTjCERqu7y6koEH4QC4ixR53c2Ye0EhGSAgUkAiA2h/Tp7ntkczC4cQ+W6inbJp7JHnPl/KkFP4Vr6hxLuA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxWbTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpSPQ/+LKtj97als+u8do9/vjg5LcHPvaLu7PEKReolT/re6pDbPiG9\r\nSmNt2f4HNne8ASgsP/keklGI87I43tUwq6IVIbADj2dCIKpKTTiiJTVm41bN\r\nfNAAfl+NeslLwu6StWYtKT3Og/j9YlvJtlIXBzORk28zu8W7NzlWdUNZV5Zj\r\nAuJxfDuyOcraSB9Zr1PqF6nwS2XpYqAq0LDSeAM4trL+gkzaiey7eTD1sxFf\r\ntnCEAoLWFkKLktnPaG0wOagOKG0C8Is659+oGR/onTeOD2iIoAvH0XRt9f1p\r\nYkq3IzcBIxS+w+gwMo4kSPTzJpn+q6vLExYDf95wcLX/zDNMuoAHgphhfrbR\r\nREKKpUu2PvuX/KJec/6EwUDnZwHJeY6xL/huQvWOunx9hP6zYYim5m25q4Gy\r\n6C6HxikwnVDjEW/DiPKOtccKa+pveO5u+StU1drZx8gEyVnhwFkQlIFVMhpC\r\n4pU629S8GO3GjVQElFQi5eVT2CpnLBWQhFcdnC/LogR57UDu0+mXVdjKBP89\r\nBxBK5StCDcqdCiIBtcReu4de/SDjUmQg95XfrLhtUAFoLYj3fn7FeMXPAIBo\r\n01oyIkoUhjF1A0UhgI0BaE5rsW5dpvAlMmsci0/cFmh0tyn14Ijop++qkAmB\r\njexOqh5letI+tMLzvRI/C++oW2PTUs9WZ2M=\r\n=1SXd\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3_1673881299358_0.22528280557360958"},"_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-mysql","version":"0.15.3-1e62a3e","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-1e62a3e","_integrity":"sha512-MBphjdoFzR4FwOqsdaOOJXFRIpGVCF61nPs0/RF7igCG5LMDShtXsn2iI5yRMQVDC2+nqLkpjBVeDCUVPFPtmg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-MBphjdoFzR4FwOqsdaOOJXFRIpGVCF61nPs0/RF7igCG5LMDShtXsn2iI5yRMQVDC2+nqLkpjBVeDCUVPFPtmg==","shasum":"9f514c3c575d924aff2568535bc84fc4644bfb93","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-1e62a3e.tgz","fileCount":194,"unpackedSize":281462,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH33lDopPpH7Pn8QklNvZrbiZDI+HAX2ENsFubPZaJiZAiEAxWh6jnWBHgiztFB9M5Ijp/XkWYAQwJ3+Tf7vP2ej0UM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxXZ2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpvOw//cg8NLFIVfYqSNdcZ+04Pvd9eoBX2PUSqULBZK95NRqgyFTxz\r\nhvTCjVXbKF2eh2GI1GiSwSvCxZtQobBqA4R8kp1oJpp7i7OpA+FrHcNyVDjU\r\nF1FpXel6NGQif7g3moc4GQds2SuRmXfescqSHsMrYfo1TKClpltJ3t/7Xnoj\r\nG14Ynr1Ns5ExW8Pr8Q7pAWKa+adEKcXWWJMfZKndjrOsixrShlI0iXdLnNSm\r\nZgb0e17USbW/lpbMSQuBGdsVJaDd/Cn2S7S7L9EwrDjT0/z2kMdt3PazrIUC\r\n3Tom05vA2p9tpz81WuyMjXBVxpJNgdJ+ilaIg1MgmEDRc4rU4RCxLMHAjXOY\r\nX7JVsLkuHUw8SA+60tbfpR36i+Btzo21OGst+DL6QD99l+FXu4PTVl5i7tRY\r\nANuac+QjNatEPD57JhIOvDiQ6bv2PjH9s1Z1K+N/jfbqt6bPSadzMpuUO3by\r\nan66tEtaUUl5EdrRFfFbss8+geKlYMEOWnGY3Y8pXEO4zE4V7owDP9gjEOAZ\r\ngNFGhs49EfnbhdddddmBMY0/lhQsXTspXKhxT1uFghB1gDud3zRQnvs3h1ZJ\r\nlafMEn3sYoVJ623wkHEMxH6i/ZXh9t3LfeiF/AhvfdOoknYAOYxp9NcfgPUE\r\njpJ+kVz6tpja23DcvWROPDOpZ8nebw37KSQ=\r\n=c+U6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-1e62a3e_1673885302446_0.5802628430089176"},"_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-mysql","version":"0.15.3-72fb2c0","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-72fb2c0","_integrity":"sha512-pCfqQFahNju5G8LL8GcqJkFa/+E1QDrDa7phsRrDFLCsAl4lqTcw0tPTjQxtTDgvgEElHxI202RLi9qMtM21FQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-pCfqQFahNju5G8LL8GcqJkFa/+E1QDrDa7phsRrDFLCsAl4lqTcw0tPTjQxtTDgvgEElHxI202RLi9qMtM21FQ==","shasum":"dcfb2f7ed2900d6f8f4b03525094238f99ad9b17","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-72fb2c0.tgz","fileCount":194,"unpackedSize":281462,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDqMcXVWILLoK9pM99N05LffdH/ClunFr3fznwIIiSoxQIhAMxnOIyDYySRVfYh8yPJMpSqPaax7GfR4EBzKogduZYf"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxX62ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp4yw//TnGbopwti0oiZfxi4tXDWM4eStyL8pxnm3D8v4c+VkDz2SPp\r\nB35EHtgpCdyhZLIjNVuORe1Fy6XHOCD6bbNOznXSL7Qd+hgLtOFlkJrGqpML\r\nPD42276oGwoxY94kr41r/3hL4I2pU40EigMR7lbEGzjaDRmefD1LFIrR5GoU\r\nNjzyu4COYi8DXoFSJ10WttZQt/ZrV3pdASA+aQtWfxYb8mjtVDUcwOTUU2vQ\r\nSsk1bPFEeTP0LrWQc9VkUVCDYWu3tZodycGE53/45zkxXExeErachhTHiaXu\r\nz74cgs4wSiiiZlKE98Jx4SNBET9fsO0NFsiGTs+OMPTQxBy2reNaC1DrdgZC\r\nlOddqTa8iqhIxUAKhN8Tenq/wCAIRQmtjwTUwr/Yook/EzN52ApvzV9iXjea\r\nE+8kcSHlt95Bf81TqLRp3W08S3WdOW7VPJKBWt9KjIi9zrgoZsYsZaqyY8Vp\r\npFFkFR4CrMOxNbCJXz0f34pjuBL17cApzj3d2bf1RkIS4m7wAoPlrskHd/Kw\r\nb2U1GXYZ8KjWxWnndbnDxvdMfPKKP/lMGwIlXrRL9zJU4/67Rdy3uAjHVAG1\r\n3KTE5IENSZ/77gpf22KE7obZNMcC2OvXjEwqhBADHk4QL85MyKNYsd+UN1Eq\r\nIgknI2Ne7lPaVZ8aVeb5jrEQKRrOoC7p9Gk=\r\n=wqCq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-72fb2c0_1673887414055_0.8638028995971969"},"_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-mysql","version":"0.15.3-23baedd","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-23baedd","_integrity":"sha512-UCXz42mm9zHCBqdwr6ifQfMDwt/fUczTPo8JRZeF/zbNkaGG9mQboIW+cDJ5q2gCyHANXynM4a6RXuUDtsiKSQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-UCXz42mm9zHCBqdwr6ifQfMDwt/fUczTPo8JRZeF/zbNkaGG9mQboIW+cDJ5q2gCyHANXynM4a6RXuUDtsiKSQ==","shasum":"043936f992bda5e310964328b31dc5d83a15f564","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-23baedd.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSh6Ow+0QM0Y+4vPd/Ll9xZEd7n7NdkfMbygLSG+yNLwIgL5nZJY5JNkmPW+XxwvSgK6XWp0GVEdBLW61vHRvbG7U="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxZJLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrL3w/+IfE382ak9Sjuj1dSLemgeJ5VA1V0we0iMTxJPupdjixqYpvo\r\n7S1xYHAaqvKvBDEN1FWXkd+jZ17Ycgkd6NtM1X19OwxSyuju3AEDTY/Sm8CB\r\nsFeVYtJPvay5Cm77AdY0RyVKAaEE1uacGJKbDhxoObIsPHzmXXQ1ZiwNsaUe\r\nZeBLsxNLUEuMYQcYYZPhugycQM1Y2/uB6TktDx8pKjH1lzwVL4hj+pNtcMjp\r\nyqoYU2fc0plu9MSYYMVrmwmsbVa+fOcgGYM/7UXjHhfaWC5asuixIPWq9oal\r\n3FHYL0cAo4cm6txm2dwRvp2KyitshM0eq4QuPjiQAJQQC/Nw0qL2scExZ/Vu\r\n+8E3GnuivePtQ15B8AOcZqI8a36mO0yKjHiDMFinuglOBZCkEU7uxBPzWG5u\r\n69+UTIqRPiuCS6pqLhXQWvwJ9Ilx2QdY0pUbyzOq+g0PMGdB9QQZNd5kcli9\r\nSFemnSBPB/ApPtEweY08Zk5T4tAI9n5R90txjCYq8CSMFbq8Ml2eAQE3SJAQ\r\nqtDU19OlV06Xo3nwIDFgss4bP/CcMtX6JZWFncoKDHyqyoujR9NrWcIMQk/3\r\nuOSAtDzIIbbqgbBPVUjz+V5wP+p3Xs8+4cUGIQFH9ST5dtdzJI5S3pT1RWNK\r\nhRw4qPE1jCuwCrlYjGD71SXs9PLxODZhzUA=\r\n=iGMH\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-23baedd_1673892427414_0.8478365234208636"},"_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-mysql","version":"0.15.3-844cb31","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-844cb31","_integrity":"sha512-sFIXysVUHtgEbsUy69r4APnGTS99Btf42HGI90tcpwuCdBfZQqbpFHPETseGm0ySql8bgW5LT5+rEQNfhIBoZw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-sFIXysVUHtgEbsUy69r4APnGTS99Btf42HGI90tcpwuCdBfZQqbpFHPETseGm0ySql8bgW5LT5+rEQNfhIBoZw==","shasum":"97358599962e17d01e900a06659e971881c8fafa","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-844cb31.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBAKjTlFUIUw2oz25UTdSl1+Is2CH1uqXEvm4Y19fvdoAiEAh5P9xzXIL/esmyD0pIfMIK//47gLjY/VYUNa+ew/sQ4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxZvsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoIrw/9EAFuqpmHqssi3/SrZRZulllrFjvyaJHxZ80kOCfGxfPSUJdV\r\nvzRYLOCgSbru7z86rwk5DETGqfsIh2/bEpdeBwD73K3ETvFJ+wNG8B9nxY0w\r\nPiwbfL7jzyth/reH0Gus41yR8Yvoyiz5iKe9WvUN3hJ+EQ/bpCiwdf3O6CjV\r\n6KMuguCuDgmMt7mUV2vB5Xng5sg0JJ7q+d83vFevGFztHcLKI6DZzrW/4Sri\r\nRDMZ98fNryopkfEWSLcs6q2AnyDEmctddPpRkexQlXuSi2ByHi63t9KFvT9i\r\nC6xNxI7rEhEIrCgXaF1rFdzaP7Q5JwP8S2ichuMLss6SXj1t2rsYpnuY/uEC\r\nky83CVk34EZkPbbz35k1Q9/fXuwMkM1MJXsXN10IVicjaLqsiKY0aZvxR7ed\r\nYYHVH1Bi7TKFR5pOVGaRwoB2DlSMcjxyq50k5EZ9z+zrvIWnyemFi06tonkp\r\nsIGbRDz7klkXG+pAZ7mmk4zX9wU0EBmrb4fVzH+WR7hdCWbHrFzYwu4MzuiA\r\ndgMwYUTaS8Kafs+Fe/l04qlEdRUPFV6oHyZc2YqULR30BQiVBBWwfevOcLb4\r\nwcMmLUKm7uLajXCSzFuYaWgJMu08dHFO5oLxyHfn/M4/pQo9kUHfqVBuvN9i\r\nLE5RnpWTGYBTdn/EMpz6w0LuzYEHho4KUFc=\r\n=Ve4y\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-844cb31_1673894892796_0.5433206510163906"},"_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-mysql","version":"0.15.3-98b2097","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-98b2097","_integrity":"sha512-JTZgA17N4wwGapbeQ5VsAqXk+MiEGk99AHCRXgvoLw50SY2lwyLd23oitBnBiLaVEJfU0jiVXzWfxpaCOx74AQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-JTZgA17N4wwGapbeQ5VsAqXk+MiEGk99AHCRXgvoLw50SY2lwyLd23oitBnBiLaVEJfU0jiVXzWfxpaCOx74AQ==","shasum":"123bcf5be8dd36440134fccbd209d78bde7c4619","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-98b2097.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFqxXEKrTy1z8k4VoUVHUcSkGVGxI0eVH4R0ZIejA1MGAiEAn5j8aFHo0ITok5eH0Sw7IsOtz5Z10dz8hrWcZZQp8rs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxazxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoISw/+MA03Kuh4HdPrRB4mzxtgzWauXwtdI3cDK4tPDyLveFOvAUvT\r\nyFqM7lLoirgYsrQy+vXYoW+5J+VCcjKsOVwX7wtYh7q8HQRfDEvMJzJLGDu5\r\nzCOkSwoJDDIiJ+BHFgkEvK0Ree3fP9zIRM7zgHRfDVOuHMAQt/IJ3Divwxtu\r\nGXEZwSRagncxCCJbJz1z12Z2EfTy89WwfM49yhh+L/GlqKBO0NsG79tq6oCU\r\nwPxlmMh7u01QK/YVH3gU6df4uEcK4sHD0SsaeD0e/xlsmrWKcg+X5PXLPPXa\r\n6WlXyQUhNyVv3jwzGg91eBzDsyH42r2haH2Ofdj4Cujg7Xs7jrmw/wF/b42q\r\nNqtC4f0XVmpIKFKemi8vWoqJBHJp5gZlVgRmYY4TfyD+J/+BNYpDBcnrl5vY\r\nEJyjLx+E6OnEUdK/R2j2uFDqgJlVEu988JWTBDbCG80vBsrM2SvZRRljvuAr\r\nM1xF9Q9iV+vACA6BriZkX9WTQ5vDh0pzGphYRgOZdpNfoKmZFPyk4z/GFHeL\r\nuyifnGWm9n7M12wuddvicfhb3HrB3BpAa3XTpkLfyMqg7k0+Hd0LKJAMyy2Z\r\nU5mSoda59NW0TfzJbFNcpRzPNJzhwsctsEO50ak1V+VIb6Nr0lsi0SaqgKqS\r\nW6040oPcMd8o3qwybJ+sbGel8dpVEAPEiSM=\r\n=2wGq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-98b2097_1673899249522_0.31805957167459"},"_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-mysql","version":"0.15.3-0dcbb16","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-0dcbb16","_integrity":"sha512-gkV53RLB0DfbiVKhNinHfaywwqe9dJF5dUxdQNgKCU+ITRgnt6MkFO4ZCTtT40eBUapUja0A0LEe7HltdsAzqw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-gkV53RLB0DfbiVKhNinHfaywwqe9dJF5dUxdQNgKCU+ITRgnt6MkFO4ZCTtT40eBUapUja0A0LEe7HltdsAzqw==","shasum":"9837492238a4c54fb8821bab046dc5e12c390717","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-0dcbb16.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAE9y1MPjcUFw2XNn1yvbvMhjTqrgxs8IXEab6Kt2K72AiBZ36Grg+BYR4y8jeC8Hk8mGOzqqvvZLKJaOE4i6PoGVQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxa0WACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpM2Q/9H+s2JBndPgmmagJUV0WMNTXY3ipKltg2yA6wpfZ/+O74UVgJ\r\nzwy9ZZ4NKn8DO6x9zVlmnvUbYddgSQyXBDeBeVoBE7ni3IJsr8asKa/igX5k\r\nZVp12m1Jj/hcjDIp2nexbiFoYukyhAbyV0dhG2iBw2BIGZ3wvJdS4RCVbABx\r\nnXNHkpljAcw5YA+9+J2GfaIkxNsrlVfiw9bp9rncxZ7ohfMzUDZRwyrvzbkv\r\ngrtruFVTrcQOLaCo1wtd37Gi2BEwOVcVlt7tuTbthAd/NjwqQJV3AQztzOck\r\nppjARuXLfqXPnUs3bwN+NrkrFBNyhukG7TTl14IRjD8lmavhiV8mLSq7+qh+\r\n9qarHQs04wEMC1qJbHkyIEZNwgbLlK/mu5OqHwH/e+blo4mbHXN8Nepc85VH\r\nU7sMfBsEe1khjPTWrinMiXITMNxSg8bns4Zpr6njguxPWxDBn32iWKn4lnDM\r\nREoypQgHuFvVD95ftzWj49TLhUKIo4Z/KnSiqLGOoZL/JlpNcYDN1XVkmR+g\r\ns1W/XHI0HzK2PfB/8DMNg6XHAEG1nPzJx5IW0x2VynJJ9F+j621ZG46Ruqrq\r\n1swRVrGM/Ihn4X+C2uK1wKWpYTGoGZrDn3Ybc8XVAKwELv3yyMLIo/pa9W6m\r\nNKdyzwo06+o8iNrhR8tzufnitE7Bki04rC0=\r\n=oDLm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-0dcbb16_1673899286579_0.35420555530841247"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-335d188":{"name":"drizzle-orm-mysql","version":"0.15.3-335d188","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-335d188","_integrity":"sha512-ANPg3FUQQJB7OituC/SwJshU3r6eaUtUCQePwtzTVJlxXxj3b6vdCFCSkg1BAEZBSfOIREoS8BuV1TYtsrcFgw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-ANPg3FUQQJB7OituC/SwJshU3r6eaUtUCQePwtzTVJlxXxj3b6vdCFCSkg1BAEZBSfOIREoS8BuV1TYtsrcFgw==","shasum":"fc4527db33bf0c4d30feebc77c0ba70c8f651128","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-335d188.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+QKgyXvYMzJCdJWZk+Fy3l6G5x/2EiIrZDIMGM7pOrAIgJannEvqb/9auMgbMVo/2onu5/0d2FmZbSHLnCtSOJUU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxvhBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpI3xAAj4VVOrkGaSOwPrYoC3VAd+FqXMkMXJv97eLTpqofPOrjNyZq\r\nmWeNtrgVoJ0vD4fwuPXmC7bVZEXinvj2SKMAjTSCX9Z9QvX/+cEFZYmtVkOh\r\n/7EuzMK4bDQft3Fk0BncMG0iKf2eZDCIyp4BGSKG9LVY9QfUMpnpAydCtQ93\r\nZNK0G2hoy5422yqMRZg32jqghh8Z9bVFYNit8+5XBaa380FGWtPasVKBe6yS\r\nIcX39TfQZpL7YIKPYOYsk3ckKjBu4A83fuebZRvPys73F7uVzLtUsyfdcUSS\r\nlZKQHDsry+89jF5CCTqRfhOdJEol6z3/z1nN0ldaK+S0iynNWGfx/DS3C3mH\r\nHGwOxSqxJWU/Fj89btMFxzS9pAGCtSO4oPQiJ6ldjdqJLhEhk5h4oRWXCTcd\r\ncAMwKPcbw4GHkRdA4jOFNFrYN3fRssZwZAjNXdjkzYAwLd7depXl414YUrNL\r\n7A7ZyaY0/UVMcFDzq0cBCQhJykBcHs6iLnsl/tvHJpRyQXIS/yDka6NAzIOY\r\nCt3dPY7Lk3d6qa4PmZsrjV5fWIQ9YUjVL3V/fCD1ClxZAqact0KfZDAFy4GK\r\nQi2BNPmH8Png7npmj/PQ6J8802NHcrAdUY36SO/vuDmeQHY66hGU6e9HXhda\r\nyAx++LWo1t4EZqSFX5e70Ua+UfgkAC/KYDQ=\r\n=cZlw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-335d188_1673984065141_0.831507049740924"},"_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-mysql","version":"0.15.3-b422bc1","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-b422bc1","_integrity":"sha512-nNXXpnjEEjSLilrnBMd9F4IVSLZpPcf+G4he1HzNi+jKCD9Obx25Lw4Y8N5N6rlgMpHdIoLYTsx5wTetiLMtRA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-nNXXpnjEEjSLilrnBMd9F4IVSLZpPcf+G4he1HzNi+jKCD9Obx25Lw4Y8N5N6rlgMpHdIoLYTsx5wTetiLMtRA==","shasum":"a4b403fa2f73eca46d4c4f7b55bbef5a09629bb3","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-b422bc1.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGWz7JXyOZ0AYais29dUlhkN3ZQUu5Tjg3wauB26N1fPAiEA5dvnP7Q4s7tN7TdFs6mS4JB3c7Cek+YOYOn1VVq/d50="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBWaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrJ2hAAhX5KRfsOl7Mw6BddtQieoVr6ETTzi8PWGpardEeUN3GdcdQU\r\nGszSvFeUiFu6RMwBcbimL16TUrToWKfHBSPy7Rnp924iaqYy7RQQMd7Rgzoq\r\nuIZAAbPLG8Vdem96dOligrbKJByUVO3DQLDQ3JLOIMWgkMZ9cGcvN4dRHipb\r\nOVJknXTn7aEK/sLfXC0Q0tL74xXuO7PXfkQN0G4sAgSp/48PI6spftg9jF1Z\r\n96ACr3sZinWPkasz41zbIklHgMhPHbaQZTnsXldKY7q7gQ26xescP8ORLKev\r\nBtrn7t3CZjEHtX1CuBQOn8eG3nhTe5gCGSe8JZNPh1w7jMfNkCUdG5Fe8yeo\r\njTvxBTFDt7RjNlpGc7Y0khCRiEWbeIrkuDg/6M3qLibl2avJFJE+iXqSiigw\r\nwcsY95dklRaJ6T6f5b13JgJ/2H/T6a8AeCXJrv1VR32vJDNdPIXHyxtMoFBI\r\nET/gRBiFH5FBuQPdqrOjR+j/+jGC+4a3a6KCpEIc8RxwAEKeL5dIeuKkt3Kn\r\n1fSyPP5skTZlB+M5jlaIe/7ynQL35p6xOOnlpaPG0tvu8TO52I8UhwXuz0at\r\ntOABxbGaMzvObo/kJe9sGsCrAK5Duxh5hXhAxi49hBh/7RBmulY9T6CH0biD\r\nWLZguaVirTq2VLE8cLpnDdoyoMDaj2X+Y28=\r\n=jolW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-b422bc1_1674057114383_0.35384624553313104"},"_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-mysql","version":"0.15.3-b3dd40c","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-b3dd40c","_integrity":"sha512-m9owmzZUDzHuXNtdGGq3l4UAMJSmbX9dKHS2GyfU/eNm4eC1HVO6hcq31xrBH9SC9YZ8FepbY4AoWkrM2iwdzQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-m9owmzZUDzHuXNtdGGq3l4UAMJSmbX9dKHS2GyfU/eNm4eC1HVO6hcq31xrBH9SC9YZ8FepbY4AoWkrM2iwdzQ==","shasum":"f57e36dcd57747d95d26315d6c8d0684288b0b4d","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-b3dd40c.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICSTRlP5zgYuuf/rMPqwlhaAg8FGqrQbkZ71JbnTGzlxAiAUv2Xu2ZGXQ4Iq3rNb/ii16FURLIC0MLt6mNICtybmNw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBiZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmofAA//dKQTbZN3FNBE6tiYtUn+48Nv5or4JTpaMevk8Yjms5jJxN8b\r\njvaVNt4WUIs3GClKNg6WoWj7Nj+IPIRmif1oXpVyK6Y8tnFOFOQyV02pFlkb\r\npShY5Auc6zxFm2XBU0rCThv4zQa5xXaAVsaMdIUdb3sP1XlyA56LixsE5ub9\r\nvCBUsLPPvcysV/+o6Xd5tLsS3yYnml81WHJY7Qd4qJJWlioS9FjdtEmxWJ6q\r\nrpPvPkgw5RnPGucEwRMpFrObTKCRCDl3ZFfXFwog6XKjyMgfi6TPsl/mCrkm\r\nCyWjUZl+y3Z8Isqq3zqepvDadtBAe5eEvGUh+C+30m+C3ihl17G1J4JSwr5X\r\nDN+3LWweeXrROKKiyRky/83ZiyKv5js9qjW5zSibZEQ3jkfquooXDutSzCLI\r\nDvZ8P/NyS0o3mP7KSBHr/4BT/PH7Yi3I25jAt43eUKeskPJrWMYeSpC1Hn0q\r\nCD65Fl6pjfqZic4JzA2CwVDhJ7Hfq8YiRVvtddGyp1XYWXX5352+zgr/5Es5\r\nQcc8ie3ffB6CR4q6h/hh8UMxVvHilxWm8jE3/oqPYITjljR06EfICgAOrhxx\r\n8gjVk+zT3iu1CcU/mMaE5D2FOURSn10LTlf810GpB8RkxV1ZxquOKgmc77m1\r\nIfRT24NFbPnuJmQ+NC+TFeCVq1PAC5peTmQ=\r\n=guZ6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-b3dd40c_1674057881031_0.6454792638169391"},"_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-mysql","version":"0.15.3-71be15e","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-71be15e","_integrity":"sha512-tW9oa3WYZzbhATh8SrSf6OXu0T9fJutQTNKFYBOR6upvC6QhTA1AeaXcHfmjWD+ahKLhGKM85rhyYNbiNTBP9g==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-tW9oa3WYZzbhATh8SrSf6OXu0T9fJutQTNKFYBOR6upvC6QhTA1AeaXcHfmjWD+ahKLhGKM85rhyYNbiNTBP9g==","shasum":"7b2b91b1b62dd3a41cc6ac9d41a1ae5fba58090c","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-71be15e.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAIc3SuvTXOqhDskbuLabEYQyD8IJCU+bN7hY5hva51KAiEAoTgBuhO3EXXrXQkyasgzjGr2ATxeCIyMQrThVwu08so="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBwvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo3+w//dxuE4+Ht1Q1TNzhJxNrIDaM3DdBtLmB1qxVT1oj+QKQ8F73B\r\nu/wXjqhxIdW0MITkdl44kxh1M4wD5+9zkwJPn1bWOJtGtr3nVUOpSirvjofa\r\n5ziGnHR/3Rys3uYsohScl4lEjtuwQZP6DWalpsv17IzwsZ1xP/CqCxa4fJS4\r\ng1sg7oQo/oIoQ8Faf3iDlHOdbpUg+ua5PdZY25d8vGLDVfC43Nk3HgBneeo/\r\nwe078+w6kAx4MBRZreD6wVXt5U0/tOtgLSxyV3BW+focZRj7aC5ZWB3pvplz\r\n2XdMilXcSrkuRL55D1TNjylZTLbZda7BM6gBSqXmq5ExdBlBMbHgY8G7CXhv\r\n7yx53mkEkXdSrpX1DkylxjHTONXMGT6wnD4caBuSwaAYtGxyemPK5pKiXn+H\r\n/PtDxWrI3+sStrVIkrQ95w7VSqmH5YHD7diN5KILtDwKSfBrciH8uxPrcTI/\r\nl++svX1DLGZjR+Mz0pCebVzJfn4PUoxrc2UEncInUgP/8RIpunWcItGfUCCB\r\n4SDL8FCtz6me2FbLVne2+DxapCbJt9zi5wXF64xegrbu2ftb1bf/s3lGuY8B\r\nIkkFiFkJIhpSeD1qmLexME/vDuM/cGglM2YJko0TIAV3+93fIQ30jFGkbUzj\r\nt3eaYAR3je24bTMODTa8SL3IgScmHajyetI=\r\n=vvFa\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-71be15e_1674058799244_0.14268785515327442"},"_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-mysql","version":"0.15.3-30915c1","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-30915c1","_integrity":"sha512-kR9efNWBXnf3SBzISN9AHx95ldCaHmjUsi/6Fbckb42C+D6ZzJf1Pb5Jmt37ylQD3CVHpN/1kKGypTlrYgfa+Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-kR9efNWBXnf3SBzISN9AHx95ldCaHmjUsi/6Fbckb42C+D6ZzJf1Pb5Jmt37ylQD3CVHpN/1kKGypTlrYgfa+Q==","shasum":"38a3e949248fa54cb24953ab4839487e5a88d533","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-30915c1.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICV3K4+hIwCy0HyR+avLnQGicLr16AjSuKSmXwBTy3WOAiB4sQvpiHOxpWQZBIKyBuqJJW2MwTUMuNHaIqYUUCkYSw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyByAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpdURAAkhScKmOgofSQYZpTJbF6x3hKaNIgg064Jmm6LK6qcaD6jclP\r\nR669Q5Fvi3WrJn/jeyVoSmikszktcJAZFSAlJ9xeKSrPxyQ2lJoCAQBqBmcE\r\nR2LPSMqe0dzocC38gxvAcUIeHNfrUDW3zckFsQ5Wj8cToWnEPB1b9ppzSzo1\r\ngYwo4OIzbcS/tlwBc4rswJReejVLuZlliQwdRrWSdHZAzths00O18Q476ZbS\r\nTAGEV/bXRVZrf9kA5rQdMmNIS3wC6AKViTAqeKMTQwSQpifzRmMUacNTx4zz\r\nhpFvpm2kB/9Ljjcgil1d5iASQAbn68bziZNwd+7fW6sMTqAMso/KBboYr+p5\r\n7ZgD0m8oaB1MmA9jx0pedMTsrMYSa12WxFhsCJX3eMsJNYskkLgZI637HISt\r\n0Xti2q+lkkAOIsQNqaRU5/LWVsaJL7ixhBmm0I6VUpvAyvbmb5dZvEDIv6qe\r\nXjlYe3McHPUwG3Mx7/RDSC2oJFrojAL/hMKiQ6mWyoRCYKN8aSAMNbrRbBEY\r\no/+3X59CEFtfoQ9K3LKwiCuTrdUGKX74c1MJG1XT39lNkNLNuznpE49d8/t1\r\nqtfnp/50rN1SRio/hb+ZPvaKjQImUXnUq4DaUzKJeEDJF0ovu0vI8PujlnL+\r\nvRe8+mmOAzeBJ7giKQGoyseg3jSYNVjDHN4=\r\n=xujd\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-30915c1_1674058880054_0.1545229947427904"},"_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-mysql","version":"0.15.3-36368e7","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-36368e7","_integrity":"sha512-kuvlfqzdHbglA/EuLJSoWJn05ImyohoJROnHYo4/9/ssTs2bj6t4BhTxmXpxBxdBIl9xCRV9yhHv51BQRIB6rA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-kuvlfqzdHbglA/EuLJSoWJn05ImyohoJROnHYo4/9/ssTs2bj6t4BhTxmXpxBxdBIl9xCRV9yhHv51BQRIB6rA==","shasum":"51077bac2fb1162876bbc84a4e4d7c885112dcf3","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-36368e7.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAq/pJU039qs9dsKOwtAmCm01lSgep+ympTdBGY2gZVuAiAmLemHFQcrFRQ68OZ69mWbbNU0WvpQsL92cdATtDaQ6A=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyPwaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrBMw//SK8sMJpAdH1fOvuVM3zJa6M2RM4wb3Obh0U+ZNJvYpqfTFZt\r\n8Gk5GuGxP8X2NzwOE+FOe1TyPu1xFJJTGPPywqfH8B575s+S+B3uVD5MyHf1\r\nV+r5DexA9o/a2Mp69rOCXtssz88bagZO8MkD6vRXqlxTtr4er7DK+xswPv2W\r\nuTlkhFPRngqhgnnO8TRCjbtCvRDC3XIGe6/yGEV7/IeTL4I/eWwkaIBjyvDt\r\nhyV5HtT1SJnNUQUdbtOI6IwU2GQHcw+M/9Ie7FGhBRHE/2vb7LUpGvLfnq50\r\nOJo8RiH6Q1Zp+oGjUUmSsu6jXw2zJHr/dFaM9iuxVQp2NnRAUrmupRrywSo3\r\nYAUYAEX9fge+bowBNZndI8ZrtTYci3uYDK7ZqcF1+q5iyMv39MqQDGpVCtiy\r\ntNzoM5Sbv7mOhVG1q275fKPCHOKlFlmupEaeyvte9qpJD8hs1Xk8aCHYZI1G\r\npXMT6RspjNeZ9Wh1HUkaowvQwg4f8fg+XsnGYtTEgSIrmsmlXbio1s3xzd3v\r\n6fkFqFj0zzQ4tCY7rGPhEwcqjSdu3Du87nTPz5cKAGjg312fFKtoIVUNiCTA\r\nZIxUA2fO+zv7O3hxk7rG1pVT0SNDxsm5hty4ASBy2rWJleQs0vrQIqIFJtxt\r\nmwfJwnrAMfS00HGtrsRrYeImxf+fdYKgUv0=\r\n=vTT6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-36368e7_1674116122472_0.24700928453286775"},"_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-mysql","version":"0.15.3-adba448","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-adba448","_integrity":"sha512-92g2DGb+7HCTMr+Zvyi4f0pKmUeQ0cAAsro3huErv1Uua98dFjYdATTNGK/59TtkycEQeAfFOcuxSX5xGgKOfA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-92g2DGb+7HCTMr+Zvyi4f0pKmUeQ0cAAsro3huErv1Uua98dFjYdATTNGK/59TtkycEQeAfFOcuxSX5xGgKOfA==","shasum":"d41ccae1b5e7ca484ff481b38aa9ac1d4e4ac0ca","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-adba448.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDtEByPMgGnD8khkXjTCyxzdiso30ZxQWEfzHUYAZ6/SAIhAJfWJflKCj+w6kyyXUmlzwJDfZBqiRQqy7+RK+P4unSg"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyQnZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr/Zg/+JE925nz6a4H+wSVBeTevw15cdZ6hD/hWVh5NzSy3k/FFWHKw\r\neVkp9FhlFtn6ld/Y6ERTSI2QgXmElu2H7Cc0NkUxtMeDKBenVlK9O3QlESO7\r\nt5jTyRJIZeNG520jHik9aMhgnFcAhnZx1Y9nPozKIhZ4iXQqds4MV0y3lrQQ\r\n+20clKXsjS8rr0S5OdeA8o5Wu0U9keTCigUOGmqnpWpEgT62qVyTrkJlz+8o\r\njeYN6Md2zZBTF5FWmLQ3LgtyiD4XcCiEheQCYWSV5pfCS4xVs8GbQe9Xph+4\r\nWH6vC2uKDQ18B1PwNtYhNHgetnMGyffqli9oGNnjI5vvo8r3NI+yNhNylfJL\r\nL/HCT85xqjm6C1U7SILsWzQ9sYSFGpjjov85Bvfc9AZ3tOyEtT0p3Q7GHJiF\r\n/LuvxtmZalgsR2nhRs8XqWpA4lah8iUuYBPWC/YzXMthrbBKeNgBIhkHC7R5\r\nfDU+ORVkBDSqgh/GX6MxsI06Kcyism0qf7jkkLBvyoQQWjeH4NIDFkWPuknT\r\nxSkhDQpgJwbUgC9DyaOoNFRKAXmtn6bA5Mem15V5lYHOfDKBQ/XS9stEsF9n\r\nMZG82OiRdxF+6iYli2Q1TNynxUTPr0rlIvSboch156dC5S4BYizNiebEIvW6\r\n1sngqoGmiQ45QePPw/bzPhtCDwBgnrklqjc=\r\n=xy1T\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-adba448_1674119640940_0.484511164959299"},"_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-mysql","version":"0.15.3-bbe577c","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-bbe577c","_integrity":"sha512-paLb5l8WjiFk+9qj9X/ruiFnA5SowkAXW//s/zt5JdPVW2b/Tl1NcpnPxEyaCwi6EwED8rlsZZlQWTouC5tlxg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-paLb5l8WjiFk+9qj9X/ruiFnA5SowkAXW//s/zt5JdPVW2b/Tl1NcpnPxEyaCwi6EwED8rlsZZlQWTouC5tlxg==","shasum":"4ebac8f7b2ad9634eef7ee3c2422b952ad4ba77f","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-bbe577c.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCPssSbcuQAOkpfzr8RiuUMRMn+vT5hoqzhMIuc0Q3FGgIgJqFinsaRoJDZ2tx3rmDjdAdIfqsh8mvuM/nUNyQY97w="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyRezACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoYtg//eXbyZukb6e12sh+tWj9zkLiGvgp3fNUyPMe/Cu3ctuEEQOD1\r\nQkrE2DEB05C/0rWCCeJ5tKVJBk7p7OB6UT8I3nGY7y3AmV9Ma8MOzDoLD33a\r\nBMXfb5U315B0Ynr6PtcXhSjzDEvKeHRnwg7QTK44NwJtWZvrSsdz84FTswad\r\nhbqcY0R7GbWAK1PgRjs4Uu1PISqVSYAuai1wCKcuQDuZBI3t4U27r+Y1lu7R\r\niSZatp6e+91pSrHtaBxJk0wn43VIKyscy99XEBQ9NtzvfsgC45O7a2Y7ihKg\r\nWBxtQMh7N4a9JxjCsK5Y/lpFgoQ7Zy2PRM0e0/g6+he4MI/63leZtZXBRm7b\r\nZ6UlIVxXc+MlW9ARo+eVE1vXpb4XCDnwxlI9LIyC3U3mGT+HdV/faHAIykq1\r\n5MChr9U8hLOr8Hcc70t9Ph3BiKs2Q2r7Yoj3cE6cLvcFuL3hdCB6eN9OJXfB\r\nWu6Zx0kuK2hzM+GWfFiFdT9wUHkuIue2HUUoS/Qmgei/C1aF2WezSwuOtIkf\r\nwND0mCijOg0sYfIIrS/28/VsQqASiMzD1G+6zW+N/4fxdKUJqDXDEJSV1MWX\r\n/RummrbnIAb1dw1Ii90LZoj0MqfJFfpZgpop1eY7QU/IElxpboYif0+oa0qB\r\nE1kPGXlQxQBSvSLIA9pxwj7+5Ua+kYDKTpg=\r\n=04IY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-bbe577c_1674123187330_0.08535724724095495"},"_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-mysql","version":"0.15.3-1c43305","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-1c43305","_integrity":"sha512-BnzWW8xoSVW68HChzfRDJ5lswOxTggdpYD4NwKRkN8NmqMLFpmJXiBRc531Ob2R3pb8bGdw+cljH85yE54nmJg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-BnzWW8xoSVW68HChzfRDJ5lswOxTggdpYD4NwKRkN8NmqMLFpmJXiBRc531Ob2R3pb8bGdw+cljH85yE54nmJg==","shasum":"778b157a47bef2c9dd8999c030401025ab0756dc","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-1c43305.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCYBYnMf0VoYD7WwZoOyjDQFtlWjfEvMg0i+GaiPPBakAIhAOu+1rj76v4YNC6zWO2p0BIJDIPETAAz2usu7z7841VZ"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySJzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrSRRAAgQ5/bajN/B3IyJHbTeKIDlRjxPAbGCmZlMoH+lW2O+ksnKiH\r\nWcBZj3vH/ppSagnGfshFkaqThwEcuTAioLIoI4bLdNPxPBe4YLE/gTAnpq9Z\r\nFIkOBzSXgmH6M56/MGXroeCjxLLAnG7d5q9P+skdTPsP6eB3iE327gOXKhfE\r\nalAhllqH5JoPkxYtu4/1IA9nQwYkcxhLXX53WptKl3fxzWklmKdMgSGlZnnQ\r\nqreqaZbWUt9X9LTCvnTrJHMBpZBPAxJY7G/s9kGEt2ZBSe3GUXAd6fEYkzB3\r\nfoXMTRgRpTFHyZpsnRbaY9KjYkVHBb+m/USde5JlNj+CP1d/r+Xk0R5plCxd\r\n7RoEpqmMACvcl0xA6WqbCTK69E8YMXZAgWxoUojCrD22BCyVcJgeNVZXF9xs\r\nWeMxsTjSC6/B5CP9aN5B/ORv2dHpX6ucqKVwRWJrqWAwNBTZWMQSeUtHzwHp\r\n0CTFwT2aRxtmD+dju5W+Is10KAp+VBtrfqE3uo+ueCC0S0W5VtS3RJqlZ39P\r\nWCocZCwbypyk36+YJUP5/QhgV5OpEIgoC3LvgXZ7bBbv93Gx52StiR0Bq/FW\r\n58OPGIGrWbjVhJwbMMamjBT0Md9giSU6g4+WXPTtoq+T2b/g9fZHmEmMXBQg\r\nMFfiSgnq2USR8iEzV64xdnn9l9dm9mQ0HSY=\r\n=t+hW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-1c43305_1674125939267_0.9132259567596963"},"_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-mysql","version":"0.15.3-f77c6c2","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-f77c6c2","_integrity":"sha512-tF+nzBPScb5iJlJbQi2ERCk5AS7qs5EK4CIfMc17d6Twu6mFIHfFcBlGzBVDF3rtaUtQUiNMfc9ohp6YaDHpMQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-tF+nzBPScb5iJlJbQi2ERCk5AS7qs5EK4CIfMc17d6Twu6mFIHfFcBlGzBVDF3rtaUtQUiNMfc9ohp6YaDHpMQ==","shasum":"477ae9bbe2b6a9ead4f35e587645a2799b43a69e","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-f77c6c2.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGo0Fk5WnZaJXoVGwrbrirTVFGEcVVV5LklSi4us+M2jAiEAiq7pb2AOm9h3C+gtYRb9HlHLFcse8nFKTOpktRyKi24="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySNBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrv5A//WEHpDwTxWwZAM/7TOH5y0/5s8Q7eCgXwGcqwjCnlxboOn9Ot\r\nNBlEXwyH6OWynWSqOeAO9OEUgykH6/YLz82OSvY43wrEKSFg7gVzLUaWek02\r\nG5r0HDo94aqAjvMoImeiNxjLQVVgDpe3rR/tO3NtlOx9CyUleaKSBaoiXbUQ\r\nZC4Oa0NTc23aKjwXsDIofleXe6U5s0i/kcFJ0QsFEU9Ju3NYtkfVtJXhL+OV\r\nSrCTwyf+4HJA+qp+uegdfYPDd3zREIbb20L1lUbW0z4x3WPEyCaSJoQxkesM\r\nGDOaUcECRDC1oXNRFflgghjDdFqpbQzP78r5dXSCWtcYVLSAV1g2E9Ugc8K9\r\n7TRAF3Rd5HQVF555K4YOHu9CzM7zwJStH8yh6KLhGaoBZiyJadnfiDErpYeK\r\neJHgFWULzKo++WrDOkKQVNxkJw4Njyk6xbZFuAcbz6Te9hOZ+uPXPp3ET9YU\r\nJdylYm1jSG8eO1l6T0Y2fPqtLLVcBAyz9TNAIdkVCovPVpUryvNJQdwRlAl5\r\niT7e5oqHxEKsfey+6MXMRVwPCgxdWC9N//rUatTslcv9VAvSrxy+sGTQYqC8\r\nsKf+sEJsOZhy8u+3q6F7kmykDJpzZqRoQq9QYqNlxJaisxt68YsE6hzwUq4D\r\ndkXuGRonjXDyEBE+HubYQ/d1ZftIBLE/uk0=\r\n=dNCF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-f77c6c2_1674126145268_0.5252236840303814"},"_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-mysql","version":"0.15.3-1f6c448","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-1f6c448","_integrity":"sha512-kdQzTB6IE0dgi2hyTi//U+XxqZ48TN9SrgMr0xE456pIkfSx91nLeT8kycQZ5tuMkW64OwOEu/WjApKDqnpFGQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-kdQzTB6IE0dgi2hyTi//U+XxqZ48TN9SrgMr0xE456pIkfSx91nLeT8kycQZ5tuMkW64OwOEu/WjApKDqnpFGQ==","shasum":"65fd623f00a591e2d7c242c3f8e70eceda173ffc","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-1f6c448.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+7GCEF0jfvf4NVl3cY5Jt+GVrjZY2HIeEZdpiy5kZCwIhANyHsdjdx2slCLCfPibht0332pffXvn1DL1p5DVZV/SF"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySPUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpo/w/+M35SW5iEnWC/aWnFm8hAYWDqqTB7mwHUKzJN0hmZjv62FDfw\r\n+tmNlCLPoaIVN6puvVQVR+kOBPIPIq5PMRyG98HRN+3wlL+xf3Ha9ruEDN8T\r\nb8pR3wWQL64J9d+dGojRFJZufmZl67EEX+yXc/kE2tXvhdZaxv3dXB2oE/SS\r\nAXvuh+iqtxEMIHL7Jd2vl+HnIiWZHFXHVO6idV/1tdTYfkRsCgWrorWEAYJr\r\nMxTWC6k2aRZI5AIils52U0O0Bv835KNpqy5nPIqordqDOQp1Nb6aVkmDhzYV\r\ns3fkF5d9n6nzgdaaOQWnvqHiAuCexwbcaovMzvt6x7+AYM1rV2snsGV5q/Fo\r\nZAa0awyfiNbv01jSJ9cw1UYfq+fuC2PmfIoxjYB/Svu2bRB46ZX8oRiGhKlr\r\nLL01iKvX5gEXRqb1VnjOGxdwcblzoaYlu/FnHPuEP0HqQSE7I1qsFG92Zf0R\r\nWjFvfSqwaLELAOYEOuorMCrJerzk7uUoxbQBUZ0Y4NMtwJZdu590xsDPxttQ\r\nB02rVRltHK0M0tVhsfwOwuj6pU9a6UqxLohy09L3aUCwZ6DEPKV0ekBiwBZU\r\nhtmG2clRAghLsOICP/hMfXe0XQ5Dg4xiPcPc/PWyWFLDFz1B3k+xHQFefmLF\r\nebqY77n7RdeXPRwbnygNhV2SIrFCvkaVSoE=\r\n=wtCO\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-1f6c448_1674126292551_0.11155531966939591"},"_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-mysql","version":"0.15.3-d8f67aa","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.15.3-d8f67aa","_integrity":"sha512-KWv3d9qHKR70l9ddlf4lD9FYp86sipXQA8tmeuGz5WbUDqpR6YlR5ofetcxxpKMux+Kp85VsvUI4KBe6IJ6xNA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-KWv3d9qHKR70l9ddlf4lD9FYp86sipXQA8tmeuGz5WbUDqpR6YlR5ofetcxxpKMux+Kp85VsvUI4KBe6IJ6xNA==","shasum":"2f320ea0587935c36779b57edd596bf93203c8c6","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.15.3-d8f67aa.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmJBra7LoJaVlIOY7eGKO9CXZBOkXSDyxwJXYJ/30eIQIhAN5rapZwiM5pyRQZEtVEyAZQPhWVwKvaIeEMzBct+LMh"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySSlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCpA//XpS4Dx20aFSMVeOcPcowzNsIlk0OK89CM5B0m0UvMGmW+szj\r\n69fkqeMBM8PBlHAeFnavWnDvmh84qiw+kw3+3gWsIMGTqrW033IOQNhQW2dD\r\nis/C8y5lO9WgvHA/iue+P2gZrMVXfTTs5ml5F2v3pQLnWccxXWI4RIr+hYVd\r\npPWlLDXbXiborgxodnWJamlKKxkNXWeM07WzKEQ6Djwpffxft+2iJFi6pwP9\r\n7GT+oPaI4BLZj9GJsnb9gdbcZi0aCcscQquZZff8zzNPQRco8qpkJ/imRIDw\r\nXe5xD/kgvl+yUM7WL63DnoKeHFtuDt7/4zh0JGkdOsUmzDoz2oeJJJYqKPHp\r\nZEfaP8fXLQyg2ZCswb/inPU4cAjBhlX0Ppc0rm29t0H2MEQW7Uh+ArgWyuto\r\nW/pk48oFOUrbcrX+jCSTHTwYggfrqu37ifiCT92EOVMr6i3EmGp/9ykijW9c\r\ncqa5UC4kP7jLhpHN5uI73tsyR23INqiM8K2MvRTbCDFbJ2mI2nahtvuJr+Ar\r\nkQpYT5HLAnMMcQDs5o1g8OTRsuAleweADWNzvqudKf7H7D0vmYKAXe1yVDKk\r\n0qTCaS11g/FuPtyrFD8bCv6ZIfchlapQCT97TaktbLO5vH0jiJ9tXlMZ4SJG\r\noEMr1vyTW9it31yaIr/bMclwQHYp/GWA3MM=\r\n=WRL2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.15.3-d8f67aa_1674126500712_0.9336585834738622"},"_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-mysql","version":"0.16.0-11f7ff3","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.0-11f7ff3","_integrity":"sha512-pud4AjQBYOV1ztyfJBh7MWMKoNihoxIcvI6Nm8Ko2rulytKMFEcdxe4glmVd2VqcpUvm2ax2yww6iv7uY8YnVA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-pud4AjQBYOV1ztyfJBh7MWMKoNihoxIcvI6Nm8Ko2rulytKMFEcdxe4glmVd2VqcpUvm2ax2yww6iv7uY8YnVA==","shasum":"3654c3e93c79e48dccd963e1dba65bbbb336afcb","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.0-11f7ff3.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCkF+91cM8iToXzaqokeTbNfLt08094dr76i+pp53PxlgIhAJyu0v6YufT6qp+GlXl78nhETcUH413+HkB3akwr2JBy"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyXhWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqYOA/+PyZHeuFpdlnq7TD4PlasKkjD7vBrPVRD+cHAeaAmikwMLVEI\r\n0lx+qw9AL18Pqa07KsEGVNiD8RytaTUOEK6g6Jd7lgXYVp1SFmK76dCKKonx\r\noVRO8zxwjNeGCa78roDQlY/5SofBYrbw94Moi+A6sDJjE764iZ6LIsnKg8h2\r\nXcYp+Iibx8gUwS3xugtLlbqL8hTQS3aT1INmIK9QOKQ1UUFZYORT7xBw0kUK\r\n4SrLrsxoKrkneRz1iynSdgggsKRIKCJ76R4EczJCZTe2e8ZwilcR69YOxhKW\r\nb0pozcklxEQiLtl4jJ7jWGi4J7j3K9B2npDFS1N3rLQJP+a1BypMsh/PrlSI\r\nsSJO+HjJoGcZzvt4qu5+L5Fq69R8ZbnqAUh8o8pGPpjV0VlHeJKPrUJt0O0p\r\n/Fkd3VmHP5dgd7p2UpsTOhqDnCah4zK/rFBQ0aPl2iN4IElk5dIxfZkuQb5Z\r\ndvWlp/NTwIYUWbEVwreLd6F3KwyJj5u9iVNmii++MWypYtpRQVp4hmOZSgld\r\nkN4LzZrjPkoUOPh69cMMhXt2roXlzRYn9L1q4aN/xzNQHDW55pJ/OExfIg7S\r\n8i4197fCct9vDy5VksvufeMojPRtlpD4llylvL7xt4VV7F5K/tb2CO9j9iDn\r\nylTlNTXmNGvTa5LJ3uF+D/rawlXjKxFZVkA=\r\n=3MTD\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.0-11f7ff3_1674147925832_0.8543828449295259"},"_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-mysql","version":"0.16.0-3e17d6e","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.0-3e17d6e","_integrity":"sha512-tylN8Hgs2g8KyBHv3q9v00q7LuwHFzcvkHDyhMVXlQOJlCT/5IHtswClY+utczUx9+diXV9B9qMRWVbLzlgiIQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-tylN8Hgs2g8KyBHv3q9v00q7LuwHFzcvkHDyhMVXlQOJlCT/5IHtswClY+utczUx9+diXV9B9qMRWVbLzlgiIQ==","shasum":"2ea2e486ba733260ce20a7aa65b9e2baa0f47f65","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.0-3e17d6e.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGIoQXsysFM70K+PagPOjQdkK+ieFHs9WktG5rYUfbwFAiB0OBEvf6OYQlp+mX/5ePvhVl4FT8ECVX/wmD+jj4q4BQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyZ1AACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr9PA/+JqBE8ZDQJyKSTc4M1brezQG6uXlRTw0VIvJnnFUknY9+PCR7\r\nTvHVv7bF+eOhsEULkubvbyNeN9Pit1bpj3z/2GzdWQsAUcrteqLq7M1/HaDP\r\nDkHF0tVtKkstU83MCgxudJll3hjUbODE4K4IMQ5OrERgM/chEMSQF6CWP3c2\r\nFNmEkfmGzjFWuJM9ZBOsbM9fASTE6oYCOzbfVIV3mbJ02PVkFx3mvOHj+MvJ\r\nxF/24596ltgtpj2de9yBlzI/5cmzcM2gxpJSdr8O41tLq5ot/zGje/56xyvb\r\nOJs+ZNcqj4j4xIhB+3wZmFMpFbojTU3lqDUrU9eDM8PihFuITaQm0vlRkOWK\r\neR8YKe1eSlCE1qyZAgez3X9AIbFn312Wg21fDcGWvCLZmfBYKReoprFjAf9t\r\nqwu87ixD4VyEIgiIZPkGY/xD1QVMTXCobcQjvQYFocgPt2aDwaavuLIdkDMI\r\nWifLe+90IwuLV4oel6qeOOWDH5tinzrXQI6lVfeBMAAu8+GwfgzMHHEoAiH7\r\neEbc2PAxZ9FxI3sy1rl+mXqKR6m/2a0duCsJkmMnIMJGVMsrr4FtvL9mVw9q\r\noWqvcNOIHsp6inqGk8X1G39K/0uGpAD4MwsYFImlglTV3yjqczPC8B+ayUvP\r\n0rORVHzHDu8X9VkCnTUi077VsqyarVT67Ck=\r\n=2LDa\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.0-3e17d6e_1674157376429_0.6249954321989475"},"_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-mysql","version":"0.16.0","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","_id":"drizzle-orm-mysql@0.16.0","_integrity":"sha512-VitMWlkFmZyNEOTicjEP+OOslC4YZb3XKmMxPeV2LYuuIEi42bjL5/qqvyrJJyvYP6tc4TkV/6LActCQ/9Bh9Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-VitMWlkFmZyNEOTicjEP+OOslC4YZb3XKmMxPeV2LYuuIEi42bjL5/qqvyrJJyvYP6tc4TkV/6LActCQ/9Bh9Q==","shasum":"e3591859e3c7564cac29e7b4a00ed0b4da9ccbc8","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.0.tgz","fileCount":194,"unpackedSize":281607,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEJs12XFWCWFYF5C4GatOPAjFCEuB5J6GhrbSt/5pN5fAiEAqTETKWjjKiYFHHktEIj/nas8PmRpI+ypI2WGBOJ3Yk0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyZ81ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrVRw//VG6UoyewrCDPIn6rVYWH5cZ5fcBhhsoNjWxv53yqgNgctnR3\r\nz9BA5woJen90pwrJEw/jqlp26hvo+LoFRU/mIvxq7xRv4Z23D4FbYAngGhXN\r\n22nO9gJoF7GB+FwIExTTp8kj7xYiHeWw56DIsUapX1rikAYT5EARHExfK/WI\r\nr4gOz3mNONuFsU4ohNX23WIN6KPbseRmbURdhn9xehBpuZR1QHz37k0A4EYT\r\nD/Td1GzF4o/KX58Fq6MRXy9uEcAED53CPjru7oa/cgGSt4j5yQNsdZd6TAP+\r\nva5BLnOa/I6hTPCA4lf/VPk6FaLk6K60HmxvIEGqjW9xjHJKn4bvSfEF3jCA\r\nDJTD69APDqRESYq5p6WV7aclCVq/a2zz4pzpLbKI5pihB6D9wlyrNxSjT3fk\r\nZwErDglziOLTMxhULw9CpG+ZAYcFEKqDLWnJIbWBOLli0HEq3oWy1ue0g/bP\r\nfqOKy5MeSfuZI9G3WVIjrtMUWvpVgd4FV5EpQNDEhXJp+G/L0FtUB4J4yxp4\r\nnOht+1sD0Tk6P4auC+YYXNGzcjKv3luFffm8hJ9N0C+v4F15coi4R1XLJiun\r\nRKFI4163ZSHsdTJUicmXQLnHYSdtDe67dC+VAZVyDkW3C6YLWKqMHXIQywca\r\nUf+EMxezKSMWtulPPmzjIQlcSNBbImqhEJE=\r\n=ZT88\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.0_1674157876930_0.7629537151415025"},"_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-mysql","version":"0.16.1-56d16f9","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.1-56d16f9","_integrity":"sha512-wcYXjS3/Ey6NqQ00h44zGv9vfAUPai6J7bakWwCD7tLsEuoGAzOP0fCaSykJTlGDtDA8ocxK5whKdI7Jf/xzSQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-wcYXjS3/Ey6NqQ00h44zGv9vfAUPai6J7bakWwCD7tLsEuoGAzOP0fCaSykJTlGDtDA8ocxK5whKdI7Jf/xzSQ==","shasum":"adc266708924fe36aa2d8ad969cd33dfdab1342a","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.1-56d16f9.tgz","fileCount":198,"unpackedSize":289098,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCiE2MPI7XZEMmrfnXKCGAGHbteWfdrlrSO27TlHbOrPgIgHmU3A3npNUS6Bt6l7/ya8VK2R88Y2CsTWrFBF31jmKs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyaipACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq9CQ/7BXVbQMUjpVvCtABVtqHTojiQsg1hj9XUh6u9AVKJ4UeuHenf\r\ng8zim53tCQjU6Cmwz0KAfzaYSIaUeWrnWMvYQAij9BBLWb0IgjZQp+Y7GzTv\r\nqR5un90sM59KWmNPIWYQQvZ8J9TgUWPozBFyOMEVp+olqJfLgSBIJEQpTgaD\r\n/hjNYB/V9lmDcNKmJrtikM1S51Ol4iEXDb9Gu9UG/ncOpG21tzEunEfQqoQX\r\nZUghWxeguiox+uUGlZYGL4dqefQ9HaRLNbsUu5ZoBjJ681E8JnxFRtUt/Q+i\r\nzF7GEWomptdlpBXNF+jnXPzIIOJ0jM19MWbjIA6X7MkqoL/J9BLDk/P5kws9\r\nzwpQKs2V13M0BVe+wcpG5GBKP3B/B3fDZ1vEMus5MgoP1eEI9YEYjzNz56ma\r\nUrs1EU8fHxoW8X5xIDc4t6mcholAf8fJWw7xNep4ctziX9AHusIM3RJoqaND\r\nJQ0LXYxqVxw2hrYE49IpwlEwa41nLw4KuJhw/9pBsbxikHiUGU66onWxE9/T\r\ny6Go6ARwo/u1jiOvrJ8ur1GAoAp8XcCQdeoHs3bGHYcOAzTGHx+7WuMvwzGi\r\nvfNi4nX0Qy8GcQZOOjNsFoZL5lexZ+pI/9aFyVkCxfjTxRnlWX3SCuoE8WYz\r\nh4qFFwvbg4CQ0AEm3SIUQWbGXvC3bOVgLD8=\r\n=VItI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.1-56d16f9_1674160297336_0.7500779871501242"},"_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-mysql","version":"0.16.1-b4b5a09","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.1-b4b5a09","_integrity":"sha512-83Cz5vk8MFl+gaTUcV1sFohviQdH9A6FXXpYTH7NF70UDhUilIOt17SVIyqpj/PMxcYbcSYwR7xytfgITOIBaw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-83Cz5vk8MFl+gaTUcV1sFohviQdH9A6FXXpYTH7NF70UDhUilIOt17SVIyqpj/PMxcYbcSYwR7xytfgITOIBaw==","shasum":"0dabb7427e7bbf251de8271269381cf6be5eb591","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.1-b4b5a09.tgz","fileCount":198,"unpackedSize":289098,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQJ/BAGFqIgLoJzr5c208K9bH6P+EsF9LRMJmMEx4eHQIhAKiez/0NwLR8i340iXjwNA++lBZmlzF07RzmRxltzef+"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyaqoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrMEg/8Dlt4zEWVjpcMH9ZINQmn+ZINKdw/qHB5mgFmzGb8+jKBJGm1\r\n5ETG1VSPvCrMhQfdn4nDU4urRW+fxRb6IWL15tQjgvZunwVNaWs3hmoMBZk+\r\nUH4PcUyRB2sut9cZGZDMN44UG4nwGNR4V12jdWaXKiBJjbVLe1D7r8M9vzNi\r\nXOFa/A43u/sx64Ntth1QUpikm1evgVf9PGq4d1eORr6xTxAD0WV5KvIy+LvH\r\nw6Bk8fY0/MgHus5kfwxvCkGBI252SR8zKj92CLK7AD8KjLvD9GCdK3akSiAF\r\nxLuWCn22g6PqgQUCxay/P0g3K0DiwAaFE+l9ur89y41pH4j01b48WoXsFYBw\r\nZCkNJ+QugtdzfSeMJ61eEtmWXCla4DWs/sf6/aC+kN49lC2FlLucEDdQBWiG\r\nyuU8OgG3p5R35+hr47KzBWgwjQNrDh90M8I8r3OkJzq1LyacUuwkNsP1t9ov\r\nNt5SWP8rG540Eyl9pUqI22JBjhwYd1ZmzDEZ0+gPuCCJClxEECTyZtSwCedB\r\nATT4IPiv38d/0ayEpXlAYC08dnIOeY6rDSa2//HAw1MsyD3Aku2Y76ayIe3z\r\nx9pmw48ITvItQZLYJpMxBBfLFqbUagP/bTliOePzgwrXqf1SGnWjuxzlWfrx\r\nLOaDX6M1UgxQjLXA8SFiM3E4akAeQ8LQJV0=\r\n=aMXz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.1-b4b5a09_1674160808328_0.9245899083117535"},"_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-mysql","version":"0.16.1-ddf4681","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.1-ddf4681","_integrity":"sha512-mFW8Pcf85BNqQTTfcZNzUvhiIHC0Qid4myaU5M7s9Z0tprA9TRSP+P1/mIjWGDm9p8FP0NstHPRzh3KbxPu4UQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-mFW8Pcf85BNqQTTfcZNzUvhiIHC0Qid4myaU5M7s9Z0tprA9TRSP+P1/mIjWGDm9p8FP0NstHPRzh3KbxPu4UQ==","shasum":"8c4a92a7b526225fdb4c4813f70f1b33d6e23054","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.1-ddf4681.tgz","fileCount":198,"unpackedSize":289098,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA88MleResNqFOoBFs29LYz0PiEkndy29Om21+fD0Dy3AiEAvBgSBWwZca5TZ/rftZWCOLAdP8ZU2acKseAbsbLQwI4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjya0MACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmojTg/+NgxEANrrZs0eEE/YmG3KQ7hoG3WCZmQ0btbaTgFgC/iTD0z/\r\nCTTkDCYPfI+wAEUPzohznzU4aP7JEej9CdG/pc7cHBp3fh25q8IS5dBK6NEv\r\nTcdYoM2SeqRTUntOcIwJSFI83P14+zcrvmKQQ3ihSnSIZituOwmXDpdrEK28\r\nJAsJ8POjoc/ZHRM6ILlviWwb+0ivEYFrzOYCnwE8uRS8YrukmFYgLec0n8jc\r\nbqfxVGdzr2BVyxswOR/zJTeBR4F3c4i54sc5BzZNtyO/4iy9SiAbZBWUbQ+C\r\ndd4waGY9Ooei4qffkWdpAGH2Uuukgu1TtxVOP8z48AyPK/S0xVB19g5jDqZu\r\n/qKzAnkk1zSCXdiE7ZKgXl9+nBCHtXCVHS7X95k0hTKdBSOhzSQBJLHLmWE+\r\nkRXOHkIqrsAR5NE05Ar3Z05Rduc+FE866z3XKJnJ4nh2ijqYD6t0zBn+BbnU\r\n+QAeOnaGEvijuA/Ji28jDCw2OZ7soCMtyYJZf8gqzk2wmHhIuoYWHcIvOplk\r\nkzKLEHKFSD5ofC0d8d1kwF2l64flP+2xnxKXTiwnNP31v+pbprJ/rw/LKarV\r\nw/ZUbkptX5Ict3N719uVd9gbAttHjE9vejSi47LiX1mVAv9oy6uVBFq6YlJm\r\ndd8c6e/sOaKZO7efzprRJGzk7rhCC3J9bTA=\r\n=8m/s\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.1-ddf4681_1674161420551_0.7205715478697565"},"_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-mysql","version":"0.16.0-484a8ae","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.0-484a8ae","_integrity":"sha512-i6iCExS6mdeZZLj1pSeVApxXkrb1KtZdSJPM7gp5hsCaNXbiMRr7W2/8ZX18AWbbpOyuAANHso3xDTbqh/PXJg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-i6iCExS6mdeZZLj1pSeVApxXkrb1KtZdSJPM7gp5hsCaNXbiMRr7W2/8ZX18AWbbpOyuAANHso3xDTbqh/PXJg==","shasum":"b1b7d8002d91eee08f7895ac324aa75e3788fe99","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.0-484a8ae.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHVB7ujK0+ezsVyn+RyiX4AM0dui0xWwu5e7Yg8MtDDiAiB7p8G41iHvw0LwAeMUsMymx1hem20h+lPxDQ8sbg3PjQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjykgxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrM7Q//TDLLAQGGfefToYSk7lN8REF9YhVcG94w8x3lYJQfKDWy3mhO\r\nZUZICE3lM1q17/xirGYs1HK/caMA7ykRhFT5agWUt3YMncj6PY4sYZ2AO+ND\r\nm+WlVM7H/rXXI2ARkKpVPVnM6Wa+E78CnpyqgovWiH2NbDeKFQATvEz0eq0K\r\nPUYv5GHBo7vPyC3ngFkJOYDcloVlgbRCAk4jflY41bDsTZhVFC6zTkP1ntyc\r\nYkJdqO8cLfvIGfvpqk6uA8/1Wj9lMSEJEgJ/3JJ4+kzipiqL2Hxb5Ep2xGxR\r\nYQLIDVHm0jzclKZJGsrXsva3GSuLh0Q8ioGGbAuzJHzXdERhutKhl270/t9k\r\n5keW25+CNGu6puLKniuy5KXLyqAbl2qlmbkTD8rj3zIgw5JGq/R2x80EZuI4\r\ntyvV+UF2jEKkG624bvX6jjDZwWYrQpzYAYUOPh4HDvoJxLA0SRv0H+TyMjG5\r\neeGyp2uLnEtxiEVnlZk+c4R8ClijmScZkHnU2EaxXgUdYnDMS6IMybvaEu4r\r\n5fl2eJ0AQLirGEZGtD7TFacKSnoXtHm6uj2t9hztKlDrD0cdmEBF73G6muAL\r\nmAxMacg7ECS+kkkCX8lV0jR0dW61c99CchudqaXTry34lxzizo7exsq9S+NE\r\n2Yci32jzeBYnJs/JIxE1/10MSxgzfymE2wU=\r\n=6SyY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.0-484a8ae_1674201137461_0.3070100566718532"},"_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-mysql","version":"0.16.0-af45b90","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.0-af45b90","_integrity":"sha512-C1cY9383lAJE5MjBaFUdf7HWlJhQHV6om5vritY/QR4V1F41zeA45esJNT3y9mI29aF0NEfvM6k0s/rwO7UwFA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-C1cY9383lAJE5MjBaFUdf7HWlJhQHV6om5vritY/QR4V1F41zeA45esJNT3y9mI29aF0NEfvM6k0s/rwO7UwFA==","shasum":"42b396c7fbab642c4d5209292130cc2b5b7cbfcb","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.0-af45b90.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDqfPqeeLCxfSX8aWNKx4nx07CJI3rngUEqAHnSQ+efQQIgLoZMYoWrkW6hBDuAw7+OBJVimPfzCBpis3B4utuOOCk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypUvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpUTg//VFbvSoSis2xSW2M5cBum+4WVr9ct2RhIJDoxACojRDzurjSK\r\nk/Oth7vYrLwzt1w7ptE2JA1uAJTuNSJv1AQ130/LS+mKkFAv2YKKsdlGuC7b\r\n5+VF1bBY6RKgoEL1ChTxFaurZHEEIlfZOm+okJJ/v1HOy3kQLaaDP8YM7NcG\r\n+Jvyoz17Tgn56hc888rmphlskTRk8Bqwz0v5NareVQTqgvNkoeWYNwh4UCrl\r\nZJubLr59rtxSRcGl0iqTLsAeHWwyNLJa0brWMrtssLuZkVvbvqGN1qpakNte\r\nuNSbg12+Qc1k+deWAO8sFBHx6XiW0i2mfRFhSu9v+WKbsWcMNfRN/lBz508T\r\nQA/xB5Gz98ZR9bn6h5jC1U5xFOW/tYaBsemZbvQi8g6lLjtn7HNCt8kSQK6Y\r\neM/rumc5zLOEeq2OFkcfM1WlivwnRPMPMCk8+BsgybAticacH4KIrI2tB0Hc\r\nPA9brOfTXM952FSgJ0F+hO4m5zINS2LEjYLyY7lHBAajCAS6qGNd47SUNjoW\r\nXyHYB5XqANv05JNhG6DSrNg6QghLp/mBUHmGVBnVwfxKBMe095lY+S53mCAQ\r\ny0Qg61yc8N2A7jlvGQ83S/E3GqO+bkP8RqzK7GeS+PkKHpnIkwZJqVdrZyC6\r\n9nDd5cONzzPIEibRuipdv4u3xTWqQ6dfH4A=\r\n=Q1TD\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.0-af45b90_1674220847324_0.2899169964888315"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-b9e9ba0":{"name":"drizzle-orm-mysql","version":"0.16.0-b9e9ba0","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.0-b9e9ba0","_integrity":"sha512-Wu7eqUWv2QGOtx5kA67k7Hwub8E8dDworq5w/DTEYMZfC/3kIeFJMTsxq+e62mUxROBOF0+zZ5aWGt+yza5fLA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Wu7eqUWv2QGOtx5kA67k7Hwub8E8dDworq5w/DTEYMZfC/3kIeFJMTsxq+e62mUxROBOF0+zZ5aWGt+yza5fLA==","shasum":"bd50b51ecdaffefc4ee3da9966e7b57df6db269f","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.0-b9e9ba0.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVH5RVcNFJlE8lXg8XVGhtIqaRDq5VGVwCp76CyyUk+AIga8bNy47FP6K7Bk1adqkbmyZN3MbzvAXv3U71hBs1H7Y="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypmOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmonfQ/7Bv4kFPmiVoqel+x87mbm0MXBsxYzbmQtJHZFHTTm+6+xKhbw\r\n1/ZZ108X/J6DWfkLAPMDP8g4srtCdihNmuCzowlSjqYGqOir+j9ZQOIuq/E2\r\nVUZuaJowIlCHYHPNuigXdhWimwSjeiM09AXWjm9XZZsYN9bomxi/WHWC/g4W\r\nnmtLP1LyLJIC/gubhIJeyOBMWYS8MF9WsDW7HuHuIwkiU8RKcUwdnq19BCi2\r\nDC3dN20bgYLKI+F0nZxbPi10yHoRJLZWXsEUnUIv2HsxwHrmMms8ZtBb0tNK\r\n3C9Ra0JYd1hnWrM83TtXOxeP3RhUFEuS/et4ONUWm6hdoFD0hbxIoJLj4lrI\r\nf9mfa8XBCgiUs5tfmsjjidos1Cttg7FvdHg0XlUrzSYI4DT/T1rSnXARxDsx\r\nlamoyeDQunnjwoU65uoVsZAAIpNLRT0mLhPo8yxQWIS2DpmFVZwTHhtQEPFu\r\n2asagYyI7Epf97rrO98c8Bz/M6B/zGPHQRaUVvn5bIxc3S3FeRPKOzkGAuLm\r\nw0WZXV7+yDZZ9Li2we30eCONSPdydPtWQdWX7NhOWBd09ZRqZbbSzyB6WLUe\r\nl5xzs3GxDZK6T3CgMVK8HYNN8IgbZR3SEDqg6ksTTcV3ChbwwgP59Zvn8f1m\r\n6ejDwArM33X0T5UoCsxEzQp/AD0cuQIlQhY=\r\n=8ib7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.0-b9e9ba0_1674221966122_0.061394836177178336"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-4124cf0":{"name":"drizzle-orm-mysql","version":"0.16.0-4124cf0","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.0-4124cf0","_integrity":"sha512-7BXsw0rtPl/znF2w+v6Nom0QzmCqE3DIl7h77aec7l9ni0H1QEqQWSKJEXs2SvvUz/j0ugSvnwiErvcy4uv62Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-7BXsw0rtPl/znF2w+v6Nom0QzmCqE3DIl7h77aec7l9ni0H1QEqQWSKJEXs2SvvUz/j0ugSvnwiErvcy4uv62Q==","shasum":"07a35c69690a4be2d9a54ccc137c68bb391cd486","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.0-4124cf0.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDOvEGwqua/fl0njUhM+BF3ltG8xtTE90IQaFbqBUoywAIhAOXh/U+tBV4E/eNyVAfMxRsQ6fOQW2HC+bmqDPpwbWi5"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypu4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqcdg//bNp5h9P0tgHL61LT0X0XYPVIRPXyAllYi8AW9trgaQtHpcQ6\r\nLbPZ9hKB6hm12swaVHRn4Yi7j0WVTGLGXsuH3l3EP46+n8JIa4B4O12YtNsi\r\nQfk+i7Wt4FiZgksvWpLLGNqP4VYH5bT3fgfEbNkcxu66YPKJ1qUz+saavAkb\r\nlhaZ2OR3blqNUZ9bN64pQ99xtTHgQaOpHCWzxMGmanzROimslNgcCDhll+3Q\r\nJO1tlTVnrEia/Nq02XKsrJUxD2p/QeZlOS6eD6M9jLpTn81dt+74XaumS5cy\r\n7B7ZMm8jf2M2Pv8trs+RImQEafWAjAgtoAFH0TKHFWIKyayZVV05xhjqDe11\r\nLGCo+ptgS07hQQNoqJFu2p+1xOE/GFloyfMltkluHuYJYBIcGaKXFSLCHGza\r\nOaVHtVlnd/HdeQ6wLNDJuJzEVRjz7UsTFd0YsGSNKpkmOOCDRlienneBvRkK\r\nELo4fDQ7IIg217kZLbGnuQ63aiIADTrcY+0GZHl8QY4O/mfoc8xUXlODXP8J\r\nzjcCCOrb/uR3eFqsC6EC5PGVFlfL50n4yK6IBTbgo4wKK950jY7hSnnHb90I\r\nzNwoxq6LkHiAbRBtKy55GMuX4C5yb58u1UHf/9I3hUFTHWEpjGiTwwdNXmxw\r\nyLbaahtGGeFxiUDzmpN5RZ1q/bxGBhaG5Fs=\r\n=oluf\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.0-4124cf0_1674222520587_0.8265055238196712"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-51c77ba":{"name":"drizzle-orm-mysql","version":"0.16.0-51c77ba","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.0-51c77ba","_integrity":"sha512-eOZ/f6XcKt0S77gfBXCFk+tasercgWpePsDNRslqSoFDBJlcHMqcmBkDTmaJLlz3rkxteQ9/MkHDFE9x0ocH1g==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-eOZ/f6XcKt0S77gfBXCFk+tasercgWpePsDNRslqSoFDBJlcHMqcmBkDTmaJLlz3rkxteQ9/MkHDFE9x0ocH1g==","shasum":"a1a376bd2d8bb93bc1ff9f92ad2eb71f252b12a4","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.0-51c77ba.tgz","fileCount":194,"unpackedSize":281615,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCUlaUNt1ekVb7LY1RXr8+6LRibZyT7tC2vog/olUS50QIgId5SpNtqWDxbV/3Iyf0v5lsvAUFkNWAm7VHn0LCZfAY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypxAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrYBBAAlj6H6aVvfwvPNV631AcGwN8/EqDsWf96WI8KApduyM0VyNTz\r\nUHFNx2D4xnRUSRlZj82vfmRM01vI7zAYtez6HAPopyaf6WG6gnhoZZeL4DYd\r\nWbjhgvW2zZNDVhpNse/Amqot7ZHjQyTCrcXu1CLFyToaGSd13orjn+o+TENB\r\npmCVEHOPnqI1Dvw/ROcuFjQ60Or+op2t1t9F+8ZiFKadeOf/uUAQrPqsDTXC\r\nJXnQOyW4mYdYMY9OQR6q1HaPi4iXLZ3FcC640lDwcYyHLjPv31Itr61s+6bi\r\nudBAsFIcbOlI2NViQTZK53lXcdelGMVFRcm89yvqzxilreu/nNLVyvwbu4em\r\nCBwAouQeOqKReU38RCevb3g7klQWZD8jSimTkvb3N5yLFECT4XovroBGCwxL\r\n3HmxhBdcmduhxviXog/j0+bl3H4kuWJtKyu3jQFrGhvnHQ9PDTMgrPRrF5zp\r\nZC5ILaZJUfgWyszNq0ji8u5siCqPmLEXLZ5R7w5hiZ0Ixk9jtxCAE2bRW66E\r\nBTiEo5JKhyOVB+4y7mMj+cVGoI2IGkjWEt5WLHPWc6Xe0ZgzKxxBLy+EfuP4\r\nb8vW0GWX+qgNNhBdJLhOvBd7WTx/5vkxg5SP7RfPGYsui7+ffu5S+VyjXmrS\r\n+HbdGXyrIwvJHdcBNn2BSbx21EMo5G5NT2k=\r\n=/SOx\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.0-51c77ba_1674222656704_0.8667745826694755"},"_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-cf5a510":{"name":"drizzle-orm-mysql","version":"0.16.1-cf5a510","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.1-cf5a510","_integrity":"sha512-WcZYzVZp2gRMWaRdvPLPEmntZjQzPO6mnA/cswjcN7f4vPW2KCKMzcASjt8F+CK8b3+8iX6+POGv6AMD7aC4nw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-WcZYzVZp2gRMWaRdvPLPEmntZjQzPO6mnA/cswjcN7f4vPW2KCKMzcASjt8F+CK8b3+8iX6+POGv6AMD7aC4nw==","shasum":"0c668260385a3c6d550db8cbb3463e402019b67c","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.1-cf5a510.tgz","fileCount":198,"unpackedSize":289098,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEvysq7itN8LAe5mkmRyHpcTA9dqr2uAc9sZzJGxvSfgIhAPqRCxPu744i9pKfwexZK7BMrkdsizysPQYBuO1S92Yc"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyqmPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrERQ//Si0DeVC21ursdvU8575W+4xLohWDrQPlogDxTb5oPaNMaFYf\r\nynsX/zBAA9J/EFXdbTbZb6eKrlfPv+3Mh3GLYb9bHJxsjB19Z9r4ZHBPlPIb\r\nzEgTGE+BpG1Y+Jwe2mfsebph+OhrZTEFwVbq4zTYNexChvpv5SvrlJsq947f\r\nmrBehKV0sQv1/TA1+Q2Sq6w79sJ44XNOpIGTHw2JeVH1KM9d1CkVxO61F7yH\r\nPsIk61UAy7qe24e25wRoge8bT6zN1uhIkQB3HnQyEEyAwduFYwPcehELdkyk\r\nM9F6/Pq7MAi1aAxeTAL7Yw6+NIihG6JAIQn7IapqO6iMYyZHNu4XC4KtDkkz\r\nocsMqy9DywPjOO31ZOP3ejhD4SE7s3FKhP5pkM0n0UeGPy94FfBAEtJ1IaFO\r\n/OTHYEbQFOGfnr2p9FmGAXeI5Y1dLcFbRh0uVLsmVyETs+UYncCrQWwT3yYz\r\nvqVZ2esclTTAJZGJrwwL8DK9hj38ZOlb55UTx/POlSWeVHpaNPd9g14lnjDR\r\nFe6vNUQUYWHBYCokS8ts/9K8hdIR4cKXTfg8fz67Zgq8B6oMKaypdg1djBP2\r\nsJqZMr4GlT5BVWFyAOGUX8tmjzAHM4cQDs7+cNORWyoKhfxpLYyHhAkbSnfU\r\nV+wjAWLEBsSVfHtSrrsa8JmZ+ltID0caBCk=\r\n=E1j2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.1-cf5a510_1674226062774_0.31691078491373803"},"_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-mysql","version":"0.16.1","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","_id":"drizzle-orm-mysql@0.16.1","_integrity":"sha512-9jtcOFMp25zN4nDs7OrAU+q9Mjg7wdoA2pDespf8NN9cup9TFgwZJFWrng+zSiU9B14FLWGbm4bI0IIUdJ9dPg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-9jtcOFMp25zN4nDs7OrAU+q9Mjg7wdoA2pDespf8NN9cup9TFgwZJFWrng+zSiU9B14FLWGbm4bI0IIUdJ9dPg==","shasum":"ffee267a39b18aaceb9b714af760724cb5222393","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.1.tgz","fileCount":198,"unpackedSize":289090,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDWSuLKHhTKr69fJ0MAdwjuS7M8Skk8xPPXnUw14QAXXgIgMCcoitFo5ab9Y4gnnUEQO4d2VPPFUI2BoQqEpeuMB68="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyqt3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2wQ/9Fto2lYVoK4me0AEh9k1r2dUEb6pjgeax6gImwnz77/CYTfN2\r\nJ+tFgFsIJIjLn1X6f2kB+S9yr+tbf69cer1u1owvqyubjrvq91Yi4Y9CRv1N\r\nztEBkgVotIYDBHQCOWYLMgONRkcd/sdOVM7+QlVmm3zuuiKF8Os1ClUiZhXB\r\nT8+az2uNDZF3m8TCngwS4teGb5+72sbtb8Hjobj3IAz+S/Di0U84RpjHjB05\r\n0gNcC0G/galJo/Z+yAgZIbIMRj1YzIRU5B2JcwAqHFWEMlRwB13KavWGIZ6T\r\nDhWjB6J0Au4OQYut2NKnlUYh1JjDIoQqI4Za9+Gze64oUd8VUR49KdgNlFnw\r\nD7jRKUWts1Tfun1jOSHCBuDhB489bfIA8kjRUiHjl3dD20LS+yl1SOmYP6iF\r\nFK2yg8BVb0uhX/+dBTgtEs1fz994ZTY/YrC0RhAoONOcGBs52fu79AF9HO8F\r\n7riCpGWFlho8BxiQoFbJa5l5DFR391fVUvFsY/S0on5O1MYIClNGU0k/UvUf\r\nQutC5dvKYnlXM8+R5jLqwx8fU1uLM4bjB2+w2aqHz1CFQ/SUrGVvSBBmBiPd\r\nhDRERZvZi5Ap/t3YhsG+jCHOXTOzeTTb2c/wc4DgAq6g8ZPhJ9I2zWthdDgT\r\nDJ5AG7i8xuP62eefV1wh/5j0wAN1OATqNu8=\r\n=u/6a\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.1_1674226551522_0.43858705621288996"},"_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-c522f26":{"name":"drizzle-orm-mysql","version":"0.16.1-c522f26","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.1-c522f26","_integrity":"sha512-cKWFB0ohzTDn7A/H+AP7X4StIIVfxEmyBSZ32bgfkbpyFIGJ9aLUpd0Is9G6vxcWSNc//j7Rs1Rhxnbu0AoGJg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-cKWFB0ohzTDn7A/H+AP7X4StIIVfxEmyBSZ32bgfkbpyFIGJ9aLUpd0Is9G6vxcWSNc//j7Rs1Rhxnbu0AoGJg==","shasum":"24eff17deaf21f74b78056ba045220054e7f0dca","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.1-c522f26.tgz","fileCount":198,"unpackedSize":289098,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNAqXKY6YuhjqimM3SuE9j31xV59z4B9nzgv11vegP6QIhAOh83i7RPtIELbbjqtwiiG9r+6QV+34GYowhtOTKwlhX"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyq0rACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoRbBAAm/8yMDMiVL/P9a+g6yhKcmufyEwuYGcCAoa7XObuXoF+rhg0\r\nuP6R/vB/wwsKILcSVZa2dE8O+Ewmht8qOJRMahf6pAQHaIquNVK3RzvFeykz\r\np0q7AwNrlN/ADMAsiWYJcGlSXjOHsdx8t969alOzJCq0zFAquNJZA02zIbF2\r\n6TLoNJ3gicP+XWpDLXP1shTUX0/6HDswFqaLsvME7IAbi3O+Mfx1P4axUoCt\r\n9hVZxqJQJhQamThyHDYuF5eEDtc1V39HHC4paqIEhiAmHDkOmukoOh2gXWnO\r\nknsiZSXC8GnPhZ7uHvLvnKC16YKqUk47wPchcMrlU3R75q2tShsfC43vZj3w\r\nUFVsHP+ChTi4yQjx+Lp9JGET8sb1/Fo+XWzr6jRhG9vilSxBtz/3htVy8Qoh\r\nmUQuNTm04BxuiDntLzIKn3LWu4ybPHk/yXZDhvv0zqwzF/nIBtzCUty++K3W\r\nAQzYF+zzjpk1FFnMcG2OnIKrIWs5Lg2TOaOFwTR7WNQVlAER6H2QRfLPEmGp\r\nt0hhtOV1KMK07qKjQMpLSdFILyx4wlOLc3JqfyZA/jP1PZ7Tlaoyc8cCQ5xJ\r\nAvhUNOVZoXl3AwGQ6CAbpqEQ6/uIRfxCtl25W7NMj7sE90hUS0aTibCxLs6q\r\nvAnPZsB72bajSC9MX6SkJUbP9/XpDZp6Jls=\r\n=+/CQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.1-c522f26_1674226987559_0.8943525074755829"},"_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-97f9977":{"name":"drizzle-orm-mysql","version":"0.16.1-97f9977","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.1-97f9977","_integrity":"sha512-l00y+Qbq74VyT0VruecQxFJQ6QPCkJWjQXd8xC6iMT2PEuiK2k0BchV3tvXcOjMaBYBERsX5olT0nc2H+fzwAA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-l00y+Qbq74VyT0VruecQxFJQ6QPCkJWjQXd8xC6iMT2PEuiK2k0BchV3tvXcOjMaBYBERsX5olT0nc2H+fzwAA==","shasum":"d586ed3a30ce95ec8f0fcbf3021a0320a1e17c77","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.1-97f9977.tgz","fileCount":198,"unpackedSize":289098,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFfhUqWPsZmWensptHP17bj9c9E7q57KFcsF+2O8+Ro2AiEAniRDMauaGjgfKXPpR3GT4C9Len8rQkdYZYmSZ/zbZwM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjy8mMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp8cw/6AxltaMSIvAw62v8nCpqoG9g9U8ys54miHtaeLk+lpVmFy7ev\r\niZuljPIuAhIZMCLngA/xzsxSPewhFvbfowV4JEWTgMjh7na+8dZlRVWIW6VZ\r\ng3uBxrMsGDV38AhtlEK5hBvFeJ8s6NhGiz+Z4iq0fj4I8VpuVTUys1ZRB7zb\r\nBDnNU8GPoD9RcAlgW37wt5rNLZVe7jIoShVS/wnVFTDZaSgBRgn11UH80GKs\r\nISJ5GxmisPluZjtHBL0l9LbqGW2sFaHI5gpL/5xiSL1Id2j0/JRfvNnK9yA8\r\n0omo+HqMPkd7Q8qPnsJmqYPZcryul9kXk0PHfUEJ+ljDHOb0Frgk4vdqxdRs\r\ntBH2LqFCtEt2fIWD1o+xuZZESFk362iv3OEOLnwmJWQWixn6BiQA89nO5DGD\r\njMsFcq6t8CrCpAScH95Zh42X1pPtlrt61neQ4dp/dtN9eOvuOVmZMJjrhUYT\r\n4wGq51yo6b6ms06BJQL0Y58uFalhtsy+KmrJ+d3NBhih1Se31TkAYTMXVyL7\r\nlg7fiejGeTsmevJwYO41o8ynbz0k6yHL96Rx+ye6f/iVHfLmTyUdD1HSQQKi\r\ng2SWP0x8F80axCxS0VKQropDX+ykVwN4IthmW/y6+h+PcyQj6aYcLAfoMrXP\r\nO5NoWnoPpHYSCruQGIOhul3fqrWqvcKWDrM=\r\n=Lmz1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.1-97f9977_1674299788173_0.5348821921791684"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.1-43776eb":{"name":"drizzle-orm-mysql","version":"0.16.1-43776eb","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.15 <0.16","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.1-43776eb","_integrity":"sha512-acPlqRlhq8MjBUd0yW5gh1iOkl/aVXZhvrHuBVUC4zUuUPO84O7thXoVgZCxMdMRGyAhjEhYrdEcJKM/+6cHjA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-acPlqRlhq8MjBUd0yW5gh1iOkl/aVXZhvrHuBVUC4zUuUPO84O7thXoVgZCxMdMRGyAhjEhYrdEcJKM/+6cHjA==","shasum":"a6526c369b24445259929a956118bef3873ea9e7","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.1-43776eb.tgz","fileCount":198,"unpackedSize":289098,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCc96fGq4zQm+WV0++LO3MQoYMGPFWjKB5B3ByECZLQDgIhALQd6GtaPZDirARfDsSmN5fP6iSV0QslaG4vOP1OynbT"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzTqvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqsGg//R8cI8T+BHZZgW2kCdQMr2h/NkiJ2+6GIBPIqUzz0wYPtiaPK\r\ny5gGbkJvsH6i/FDw2qNdR1YYn2HSGBjoztzyV2l1HY3W6iXfoMfnYZa4m7a2\r\n9PjN3EjgjApZ4Q671bbHfN1T+wrqTujL4onHGMdvzaEHo7BiQ7FclWXScYmF\r\nt4KNDoL6cf+7zRrG07kZMUF0dv0RF559oTQKd+xGhWPEVNu4K9cHysV7Epfy\r\nOj1VM1F5Aa/t9Xx9sKjNBKbUcPm/T45/4E5omviV2/8aZ+ommtT+5rnA4Af8\r\nVQAmrK/oWEgkI3q3GhYjdirwU1eHen5igKsdC5Oc5DEnji/GtRDzIFqsP4Bb\r\nAgXFyrY2URhNocB2raooUASoFTZ+t7WwpK8at84yO4IaVXdL0yILItaFPj2q\r\nPIIKoam0bwKm6WCqIqj9QMg/5TpPz0eioilkyS02rW9KCGg7za+cSHGktIgu\r\nLrkpf9UIEBWEj5SRdDAMuBsHzisVqfSsPs3/ten/gAgnXWkGFofbOLZZ2lzo\r\nM8pHs0vSjfnZxcmvVP5OxghHLa3PRfaMyKvyxdjlcZTGefzVByzJrFIuadCQ\r\n+/VH9Bkb2MwzQ4VT7P/6GyrHMMoLPx0Soz1goOqTTUPOeigfxtvvHq1AAP3w\r\nKU1ZSweha3OQBM0gkAJFPM247J0eeRb2HLs=\r\n=Kf12\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.1-43776eb_1674394287489_0.8523676331972663"},"_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-2c4c5b1":{"name":"drizzle-orm-mysql","version":"0.16.1-2c4c5b1","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.16 <0.17","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.1-2c4c5b1","_integrity":"sha512-DaVqJhg53eY2UmKyvLaHWTR9xafT+CWc5F5lrMaEpgeQq9+lx3Sy4E1Fxf0dn2Sf2MY+ws2cjp+gAVg2eBpwWQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-DaVqJhg53eY2UmKyvLaHWTR9xafT+CWc5F5lrMaEpgeQq9+lx3Sy4E1Fxf0dn2Sf2MY+ws2cjp+gAVg2eBpwWQ==","shasum":"98981b95c52b9b443d71ba28a5740909fdd1b1aa","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.1-2c4c5b1.tgz","fileCount":198,"unpackedSize":289098,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBB37b4yfYnQ4wGolCkGDCRqzAJq1ZyeB6RmT76UsatUAiBUHukGA5QNGoYD+KVFiNEnBuOOGmhw06v8b4goUA9RTA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjz4R2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpQog//RXYigr0P0jqJKBCKZCXvrX0fYs8hR0Ns7udmr+SKb+vko5dy\r\nz1UAbH7OpMBQhsJo627l9HQutMdNUTCVjOfipPTIQhk/7W0WGq7fbK7gEqzE\r\nXCL1ItbWNOr71QlH8ypIS09N90jgmKf0n753cPOKdPNfuKx9PMbI/2WLVkmp\r\nNhTN9AVotrLtjQIPguuuwykLyP5Eb+oo/vlnZpTUF+t5TxPVWf2E2VXtg1QG\r\n5t9jhwQ3L+k3BsVTdVnDJY/IFaeXkiYgfasX59EVJidmKxU3HwFRnPxrxdJH\r\nX6055jRI3tbMbaOzkGiHmTgojNJyVNdKXXsDaO7CRxpejm1B7AMArvQzgezQ\r\nXDobXoZM30dGK9LgZyKzNjDUX5lDc6y+B1n6IB1DdzjkNY3GN72yxD3zU5+L\r\nxbkrnDkKpN91Qi+7TJmXmytiFq3m1slKNom11F9vv6Mri3oeqnFF8jTMl520\r\nl21R4UaRTi+CBuOS/xZ53368Pms0W2/s4lwYRrRXOfqs29O8liIiKX5RctWY\r\nBHQJEslWPHgFGfiAx8vr2PW9yBNnTbcD5z25sHQy7+dcczCZHtpF5pKKWxpm\r\nqoMegNlQ+kCPDvP1Dw5x12Xv2XmRDRV3li8a2TlluwmvXlIw7s/3hzlv4org\r\nM0CBiaVbyfWZUlKVMnmcDN3WFRNA5ZpmMx4=\r\n=JNK5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.1-2c4c5b1_1674544245996_0.12965146886411638"},"_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-60d4ce6":{"name":"drizzle-orm-mysql","version":"0.16.2-60d4ce6","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.16 <0.17","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.2-60d4ce6","_integrity":"sha512-r45Hvs2K7YF2twpZrD6apP6jIBqhxaKwqgI5LOt6JgzVcm2/b5u0/J76ts0vd8lXPjuJmK0PM96rspP18J8Yug==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-r45Hvs2K7YF2twpZrD6apP6jIBqhxaKwqgI5LOt6JgzVcm2/b5u0/J76ts0vd8lXPjuJmK0PM96rspP18J8Yug==","shasum":"7c6f08c014406fe8ab72cbafe17f132054159d75","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.2-60d4ce6.tgz","fileCount":198,"unpackedSize":289098,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFKC/wpO2gubwccn3Kragm6tGlCaEXKGpNetCiATc2rnAiB1jJn8v/lfvNB4V0iYWzqZC5u2kExgOpYxQNGyuKYm6Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjz4Z7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqGMQ//ZHaSXcwL39dOHbSBTy7xzhuSk8VsszC42TNtLjx72LfKj325\r\n5qZhLHmlBnd0KbuJoatgDL1XZzT/ZuQxG9Neabbkga0ZAZn2MLMYTVCrHtDC\r\nc2osFBbr/nOwX6U+k+Rv0TQPk4R6fF809HjMeoX5IVbbbsltUQJxL3s/3mJ+\r\nuArBY/dv1MkHZ3NMq3mkSkqOfBVon1Me4jpulapzM7q+ti8SDMRGiHiowgDB\r\nn/6HNqA3uCcTpnSXdequ5uhQbqRmZdoBWwXFgkeZFNnMB7j1BQCuLA7FFgJH\r\n9SYMWzaXJTKNXIAvlrIX9cWlBPXzvNR9bCnjjc4pxtmH3KyH67xqvs9of50b\r\nniR5kzUk9ydLQ46ZGlYkqxQ1yX5kQFEJPpD9ooMRO4/WnT9WnpwYcqxmzBm9\r\nxCVv2JCx52Rq2swltACKa8UcnqTnYTmps1xWtF8VkRoG3WNI5ONZfiCWy++N\r\nIDx1QKeeg1KouJ3YPXHh7vkGYMqeJzMGI/lQSbJ2lgbhdppqmxWkmbXHGR+w\r\nnyKJ49teWJYXWAXz7Bxj3YodPaRMi7pftyXHvCdb44A8wBHm+V+1Iu57VJk3\r\nTyBv6H1jOlAfV09ZHTR70VOATHmHom45vk3+y4bhEiuES1zrgJNVg6QfOzYj\r\nIjx0ww4m8wa5O0F4km3jti07K01zlyT74Z8=\r\n=7Z/N\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.2-60d4ce6_1674544763747_0.02383471174590035"},"_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-mysql","version":"0.16.2","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.16 <0.17","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","_id":"drizzle-orm-mysql@0.16.2","_integrity":"sha512-BIvVHA502pxZuW/7plKPoKsuDGTqjSELOg035MpARrqGWQO3vPJrCqsqGZ/Tpazik6srjaiMCLDK/+3vgDJavw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-BIvVHA502pxZuW/7plKPoKsuDGTqjSELOg035MpARrqGWQO3vPJrCqsqGZ/Tpazik6srjaiMCLDK/+3vgDJavw==","shasum":"2663278a333c6f643d3d21c8685b27e904f3c3d5","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.2.tgz","fileCount":198,"unpackedSize":289090,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE2jrKXOGJqflzD39Nbn71daJaKeoBIoZ8vZWtZG8IRDAiEAlL+AgJo5BTz/uvmOUiQpF7ObgEv/nFRkAw7z40azfeI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjz4q0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp5lQ/+PfTNGGnuX51nMharwKnyfVkUDQZkFOikksp3kedwt816YtO8\r\njAYrhjP9FPdn3PWvpN+0cog6LUw0EaNknb0NsowgN0O7C1vCTLd97/ZiKtNo\r\nWDWcP3bKPm1MpooLXTgZFgJXFBMwDpaoO3GTjCf1PaU/20yO2RlPkso/LKYo\r\nlZRo41zV8Rcj+Lv9ejzx/bjkOOswXYehUmBIphgC8HzeoNLg8EGpaSqxN4ey\r\nk5T17awi6/tTf6IJLdwZKXXgW7CvcHEHgbs6ChTJ2wkRoDn30UVMOrMC8jhs\r\nvVjvJiy1Sb1T1pMuVO46nDzd5Pax+KUe+UnrZGb31ufPmnilr2lsc7svlK3S\r\n3nJtxkmVyKA0Rnm2ztlVIJj9RwyMushjbgqc4tok40kWnE9thA8+eSk6QEvB\r\nGb458jFfNoBY0fSkh4sie16PmQLPGaioavZtodcdPWIiw9MHVH17d7rU6Z/x\r\nC6opvtF74UCKGOTxvjUlxPUWwwPVj3twkSaH9jMk9F45/Jo/dsAMbOjjdR5J\r\nP/pZduYdiInZXz66hpNg2YtvqEM9UxPtEsm2za5WQjwqEmv8YbgFsVOdWDP2\r\ncx8/P63T9JkCwj6tGhf1EBHPa5B85/kkfF45lXkmDCbuh1NhA+nN98gXkwI7\r\nmqb6N+32h6EL1JGgmPa3sP87zgluA0hiQJk=\r\n=RKAv\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.2_1674545844084_0.7638403974346"},"_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-78fb61e":{"name":"drizzle-orm-mysql","version":"0.16.2-78fb61e","description":"Drizzle ORM package for MySQL database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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":{"drizzle-orm":">=0.16 <0.17","mysql2":">=2 <3"},"peerDependenciesMeta":{"mysql2":{"optional":true}},"devDependencies":{"@types/node":"^18.11.12","drizzle-orm":"link:../drizzle-orm/dist","mysql2":"^2.3.3"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | MySQL <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-mysql?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-mysql'>\n<img alt='pg version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-mysql/peer/mysql2'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-mysql'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='NPM' src='https://img.shields.io/npm/l/drizzle-orm-mysql'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\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.\n\n## Installation\n\n```bash\n# npm\nnpm i drizzle-orm drizzle-orm-mysql mysql2\nnpm i -D drizzle-kit\n\n# yarn\nyarn add drizzle-orm drizzle-orm-mysql mysql2\nyarn add -D drizzle-kit\n\n# pnpm\npnpm add drizzle-orm drizzle-orm-mysql2 mysql2\npnpm add -D drizzle-kit\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\n## Quick start\n\n```typescript\n// schema.ts\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n```\n\n### Connect using mysql2 Pool (recommended)\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\nconst allUsers = await db.select(users);\n```\n\n### Connect using mysql2 Client\n\n```typescript\n// db.ts\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nimport mysql from 'mysql2/promise';\nimport { users } from './schema';\n\n// create the connection\nconst connection = await mysql.createConnection({\n    host:'localhost', \n    user: 'root', \n    database: 'test'\n});\n\nconst db = drizzle(connection);\n\nconst allUsers = await db.select(users);\n```\n\n## Schema declaration\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n\n```typescript\n// db.ts\nimport { int, mysqlEnum, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\n// declaring enum in database\nexport const countries = mysqlTable('countries', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n}, (countries) => ({\n\tnameIndex: uniqueIndex('name_idx').on(countries.name),\n}));\n\nexport const cities = mysqlTable('cities', {\n\tid: serial('id').primaryKey(),\n\tname: varchar('name', { length: 256 }),\n\tcountryId: int('country_id').references(() => countries.id),\n\tpopularity: mysqlEnum('popularity', ['unknown', 'known', 'popular']),\n});\n```\n\n### Database and table entity types\n\n```typescript\n// db.ts\nimport { InferModel, MySqlDatabase, MySqlRawQueryResult, mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport mysql from 'mysql2/promise';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: varchar('phone', { length: 256 }),\n});\n\nexport type User = InferModel<typeof users>; // return type when queried\nexport type NewUser = InferModel<typeof users, 'insert'>; // insert type\n...\n\n// init node-postgres Pool or Client\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nexport const db: MySqlDatabase = drizzle(poolConnection);\n\nconst result: User[] = await db.select(users);\n\n/* type MySqlRawQueryExample is a response from mysql2 driver\n   type MySqlRawQueryResult = [ResultSetHeader, FieldPacket[]];\n   type ResultSetHeader = {\n      affectedRows: number;\n      fieldCount: number;\n      info: string;\n      insertId: number;\n      serverStatus: number;\n      warningStatus: number;\n      changedRows?: number;\n    }\n*/\nexport async function insertUser(user: NewUser): Promise<MySqlRawQueryResult> {\n  return db.insert(users).values(user);\n}\n```\n\n### Declaring indexes and foreign keys\n\n```typescript\n// db.ts\nimport { foreignKey, index, int, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm-mysql';\n\nexport const countries = mysqlTable('countries', {\n    id: serial('id').primaryKey(),\n    name: varchar('name', { length: 256 }),\n    population: int('population'),\n  }, (table) => ({\n    nameIdx: index('name_idx').on(table.name), // one column\n    namePopulationIdx: index('name_population_idx').on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex('unique_idx').on(table.name), // unique index\n  })\n);\n\nexport const cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 256 }),\n  countryId: int('country_id').references(() => countries.id), // inline foreign key\n  countryName: varchar('country_id', { length: 256 }),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// Index declaration reference\nindex('name_idx')\n    .on(table.column1, table.column2, ...)\n    .using('btree' | 'hash')\n    .lock('default' | 'none' | 'shared' | 'exclusive')\n    .algorythm('default' | 'inplace' | 'copy')\n```\n\n## Column types\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\nmysqlEnum('popularity', ['unknown', 'known', 'popular'])\n\nint('...');\ntinyint('name');\nsmallint('name');\nmediumint('name');\nbigint('...', { mode: 'number' });\n\nreal('name', { precision: 1, scale: 1 });\ndecimal('name', { precision: 1, scale: 1 });\ndouble('name', { precision: 1, scale: 1 });\nfloat('name',);\n\nserial('name');\n\nbinary('name');\nvarbinary('name', { length: 2 });\n\nchar('name');\nvarchar('name', { length: 2 });\ntext('name');\n\nboolean('name');\n\ndate('...');\ndatetime('...', { mode: 'date' | 'string', fsp: 0..6 });\ntime('...', { mode: 'date' | 'string', fsp: 0..6 });\nyear('...');\n\ntimestamp('name');\ntimestamp('...', { mode: 'date' | 'string', fsp: 0..6 })\ntimestamp('...').defaultNow()\n\njson('name');\njson<string[]>('name');\n```\n\n## Table schemas\n> **Warning**\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\n> \n> In this case you may use [alias syntax](https://github.com/drizzle-team/drizzle-orm/tree/main/drizzle-orm-mysql#join-aliases-and-self-joins)\n\n---\n\nUsage example\n```typescript\n// Table in default schema\nconst publicUsersTable = mysqlTable('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n\n\n// Table in custom schema\nconst mySchema = mysqlSchema('mySchema');\n\nconst mySchemaUsersTable = mySchema('users', {\n\tid: serial('id').primaryKey(),\n\tname: text('name').notNull(),\n\tverified: boolean('verified').notNull().default(false),\n\tjsonb: json<string[]>('jsonb'),\n\tcreatedAt: timestamp('created_at', { fsp: 2 }).notNull().defaultNow(),\n});\n```\n\n## Select, Insert, Update, Delete\n\n### Select\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { mysqlTable, serial, text, varchar } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { and, asc, desc, eq, or } from 'drizzle-orm/expressions';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('full_name'),\n});\n\nconst db = drizzle(...);\n\nawait db.select(users);\nawait db.select(users).where(eq(users.id, 42));\n\n// you can combine filters with eq(...) or or(...)\nawait db.select(users)\n  .where(and(eq(users.id, 42), eq(users.name, 'Dan')));\n\nawait db.select(users)\n  .where(or(eq(users.id, 42), eq(users.id, 1)));\n\n// partial select\nconst result = await db.select(users).fields({\n    mapped1: users.id,\n    mapped2: users.name,\n  });\nconst { mapped1, mapped2 } = result[0];\n\n// limit, offset & order by\nawait db.select(users).limit(10).offset(10);\nawait db.select(users).orderBy(asc(users.name));\nawait db.select(users).orderBy(desc(users.name));\n// you can pass multiple order args\nawait db.select(users).orderBy(asc(users.name), desc(users.name));\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(expressions: SQL[])\nor(expressions: SQL[])\n```\n\n### Insert\n\n```typescript\nimport { mysqlTable, serial, text, timestamp, InferModel } from 'drizzle-orm-mysql';\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  createdAt: timestamp('created_at'),\n});\n\ntype NewUser = InferModel<typeof users>;\n\nconst db = drizzle(...);\n\nawait db.insert(users)\n  .values({\n    name: 'Andrew',\n    createdAt: new Date(),\n  });\n\n// accepts vararg of items\nawait db.insert(users)\n  .values(\n    {\n      name: 'Andrew',\n      createdAt: new Date(),\n    },\n    {\n      name: 'Dan',\n      createdAt: new Date(),\n    },\n  );\n\nconst newUsers: NewUser[] = [\n  {\n      name: 'Andrew',\n      createdAt: new Date(),\n  },\n  {\n    name: 'Dan',\n    createdAt: new Date(),\n  },\n];\n\nawait db.insert(users).values(...newUsers);\n```\n\n### Update and Delete\n\n```typescript\nawait db.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(users.name, 'Dan'));\n\t\nawait db.delete(users)\n  .where(eq(users.name, 'Dan'));\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n#### Many-to-one\n\n```typescript\nconst cities = mysqlTable('cities', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n  cityId: int('city_id').references(() => cities.id)\n});\n\nconst result = db.select(cities)\n  .leftJoin(users, eq(cities2.id, users2.cityId));\n```\n\n#### Many-to-many\n\n```typescript\nconst users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst chatGroups = mysqlTable('chat_groups', {\n  id: serial('id').primaryKey(),\n  name: text('name'),\n});\n\nconst usersToChatGroups = mysqlTable('usersToChatGroups', {\n  userId: integer('user_id').notNull().references(() => users.id),\n  groupId: integer('group_id').notNull().references(() => chatGroups.id),\n});\n\n// querying user group with id 1 and all the participants(users)\nconst result = await db.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1));\n```\n\n#### Join aliases and self-joins\n\n```typescript\nimport { ..., alias } from 'drizzle-orm-mysql';\n\nexport const files = mysqlTable('folders', {\n  name: text('name').notNull(),\n  parent: text('parent_folder')\n})\n\nconst nestedFiles = alias(files, 'nested_files');\n\n// will return files and folders and nested files for each folder at root dir\nconst result = await db.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, '/'));\n```\n\n#### Join using partial select\n\n```typescript\n// Select user ID and city ID and name\nconst result1 = await db.select(cities).fields({\n  userId: users.id,\n  cityId: cities.id,\n  cityName: cities.name\n}).leftJoin(users, eq(users.cityId, cities.id));\n\n// Select all fields from users and only id and name from cities\nconst result2 = await db.select(cities).fields({\n  // Supports any level of nesting!\n  user: users,\n  city: {\n    id: cities.id,\n    name: cities.name\n  },\n}).leftJoin(users, eq(users.cityId, cities.id));\n```\n\n\n## Prepared statements\n\n```typescript\nconst query = db.select(users)\n  .where(eq(users.name, 'Dan'))\n  .prepare();\n\nconst result = await query.execute();\n```\n\n### Prepared statements with parameters\n\n```typescript\nimport { placeholder } from 'drizzle-orm-mysql';\n\nconst query = db.select(users)\n  .where(eq(users.name, placeholder('name')))\n  .prepare();\n\nconst result = await query.execute({ name: 'Dan' });\n```\n\n## Raw queries execution\n\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.\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: MySqlQueryResult<{ id: number; name: string; }> = await db.execute<{ id: number, name: string }>(sql`select * from ${users} where ${users.id} = ${userId}`);\n```\n\n## Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.\n\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, mysqlTable, serial, varchar } from 'drizzle-orm-mysql';\n\nexport const users = mysqlTable('users', {\n  id: serial('id').primaryKey(),\n  fullName: varchar('full_name', { length: 256 }),\n}, (users) => ({\n  nameIdx: index('name_idx').on(users.fullName),\n}));\n\nexport const authOtps = mysqlTable('auth_otp', {\n  id: serial('id').primaryKey(),\n  phone: varchar('phone', { length: 256 }),\n  userId: int('user_id').references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE `users` (\n `id` int PRIMARY KEY,\n `full_name` varchar(256)\n);\n\n\nCREATE TABLE `auth_otp` (\n `id` serial PRIMARY KEY,\n `phone` varchar(256),\n `user_id` int\n);\n\n\nALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;\nCREATE INDEX name_idx ON users (`full_name`);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-mysql/mysql2';\nimport { migrate } from 'drizzle-orm-mysql/mysql2/migrator';\nimport mysql from 'mysql2/promise';\n\n// create the connection\nconst poolConnection = mysql.createPool({\n    host:'localhost', \n    user: 'root',\n    database: 'test'\n});\n\nconst db = drizzle(poolConnection);\n\n// this will automatically run needed migrations on the database\nawait migrate(db, { migrationsFolder: './drizzle' })\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-mysql@0.16.2-78fb61e","_integrity":"sha512-/4q4w4GQ2Acl7+AR+UruyqVHBGaT3nhtF2EeD/Mc5Z7tqaka2WQAaY/BT2Y6vu5hoI98vo63l6zjXIG8NoILyQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-mysql/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-/4q4w4GQ2Acl7+AR+UruyqVHBGaT3nhtF2EeD/Mc5Z7tqaka2WQAaY/BT2Y6vu5hoI98vo63l6zjXIG8NoILyQ==","shasum":"fec8bc0b38846023441c7ab2c1ba986b593c8569","tarball":"https://registry.npmjs.org/drizzle-orm-mysql/-/drizzle-orm-mysql-0.16.2-78fb61e.tgz","fileCount":198,"unpackedSize":289098,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICVjaXLcQZv351WxS82kC7+2s5qjpO6xI2RsCW8Hw3mjAiAM74y9cwcYAATfC+PKpZpL8CGY/mH92RtdbcQvw7FPaQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj0ZhXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoZCA/9GcoCY544iN0TQx6GIkEaW5Lnpx38w5JPzMnWxRjSlWVFFKqO\r\n3fkHP9kJuXWOQvpakRx0NXSm6bXf8sa42Kh1/e15vHt6j7aN1Y6gRE9A6lM3\r\n60vBJLuOHmnpNJnrnkK8BTR6+vKgYomdv7Uw0EA2TxTolvpQBr9BZoxty9QW\r\nLN7aIvgt+JqL1kuamVJ3lmmPU843rrJsfxI0df6c2GEruFMLFTeCGbmQ+kpk\r\nGDxeAjVSq+ahU+rxS1lmdhi93fM3LDPpWendd/i1qtn5RpprN8pneH++Edhp\r\nwIqqy1dZa+EXpj2LkMQOOqWInSAI4p16lnP7ntxVZ8VEYVE97LFuRhoh+nWO\r\n0aCj4cq/6Rod/bog0J5taZjS/gLdnomQTgiaasFgYnvPy1IswT6gST1fal2J\r\nHiqW4dwui068fg6P5aeFb+GbfIr/U3Emu9qZi1LwxnEEDgoakezkBKsQvWKt\r\nCLidTYs+XXvcYKH96masfU4ucAVczEMvaQaLyEv07yeiwPgWhxvmj585oiDl\r\n06uJD4+o3nUVrRCMqIjcoLHFMf0tw4dXnZZlRhEdTX+CPa6RkZmK2jVS3FaY\r\nZtXvQyvJjhr+8xQ2Qk71Lc7705hAbzEtwRMn59fpDIq13bWQfdedqSW1Gq7k\r\neTZFtXQ0McEufxbHGXVyfXKv/fWXynxZTlo=\r\n=1Fv4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-mysql_0.16.2-78fb61e_1674680407265_0.51617874298523"},"_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-07-30T08:32:44.839Z","0.12.0-beta.0":"2022-07-30T08:32:45.068Z","modified":"2024-05-24T19:50:45.774Z","0.12.0-beta.1":"2022-07-30T08:37:42.106Z","0.12.0-beta.2":"2022-07-30T12:43:55.708Z","0.12.0-beta.3":"2022-07-31T17:39:34.848Z","0.12.0-beta.4":"2022-08-21T10:23:51.976Z","0.12.0-beta.5":"2022-08-22T17:19:36.106Z","0.12.0-beta.6":"2022-08-22T17:27:56.011Z","0.12.0-beta.7":"2022-08-22T17:49:35.217Z","0.12.0-beta.8":"2022-08-23T18:06:12.519Z","0.12.0-beta.9":"2022-08-23T20:36:56.336Z","0.12.0-beta.10":"2022-09-05T12:55:27.174Z","0.12.0-beta.12":"2022-09-13T11:31:18.888Z","0.12.0-beta.13":"2022-09-13T12:00:39.608Z","0.12.0-beta.14":"2022-09-14T08:45:07.092Z","0.14.1-1c58471":"2022-12-15T22:32:21.545Z","0.14.1-1d98f11":"2022-12-15T22:34:04.221Z","0.14.1-f617bb6":"2022-12-16T10:46:02.937Z","0.14.1-c5dca58":"2022-12-16T11:00:19.172Z","0.14.2-3793d78":"2022-12-16T11:16:39.617Z","0.14.2-3967f06":"2022-12-16T11:22:11.419Z","0.14.2":"2022-12-16T11:22:34.907Z","0.14.2-e902ba8":"2022-12-16T13:26:51.923Z","0.14.2-a52eacc":"2022-12-19T17:44:15.772Z","0.14.2-5514014":"2022-12-19T17:45:18.184Z","0.14.2-cc06fec":"2022-12-19T17:46:00.063Z","0.14.2-c7344a5":"2022-12-19T17:46:49.065Z","0.14.2-01c3d82":"2022-12-20T18:19:09.427Z","0.14.2-4eada6d":"2022-12-21T17:51:03.373Z","0.14.2-1e42665":"2022-12-21T18:00:25.673Z","0.14.2-e295848":"2022-12-21T18:07:57.809Z","0.14.2-c153bbf":"2022-12-21T18:08:00.914Z","0.14.2-6f226c1":"2022-12-21T18:10:37.467Z","0.14.2-f8d0d46":"2022-12-21T18:11:35.310Z","0.14.2-cce4cab":"2022-12-21T18:15:29.476Z","0.14.2-314c1fa":"2022-12-21T18:48:35.930Z","0.14.2-5b14ef4":"2022-12-22T21:02:05.916Z","0.14.2-9ba6169":"2022-12-29T11:32:56.152Z","0.14.2-5ce7d69":"2023-01-02T18:45:55.695Z","0.14.2-4e3a5b9":"2023-01-05T11:32:57.887Z","0.14.2-dd27c86":"2023-01-05T15:26:02.426Z","0.14.2-67805d4":"2023-01-05T15:34:16.980Z","0.14.2-1bcee50":"2023-01-05T19:36:29.006Z","0.15.0-07f606f":"2023-01-06T14:31:17.901Z","0.15.0-a90d3bc":"2023-01-06T19:03:17.000Z","0.15.0-7d17618":"2023-01-08T14:32:10.312Z","0.14.3-59f0a3a":"2023-01-09T14:32:41.268Z","0.14.3":"2023-01-09T14:36:23.750Z","0.15.0-2e1e5b2":"2023-01-10T11:26:37.685Z","0.15.0-60954a3":"2023-01-10T13:56:01.606Z","0.15.0":"2023-01-10T14:06:33.457Z","0.15.0-88523f9":"2023-01-12T13:56:05.831Z","0.15.1-f67dd9d":"2023-01-12T14:44:16.056Z","0.15.1-80901ff":"2023-01-12T14:47:28.606Z","0.15.1-4a5b2e3":"2023-01-12T15:58:55.668Z","0.15.1-9728cc6":"2023-01-12T16:35:27.897Z","0.15.1-19c5c02":"2023-01-12T16:48:51.802Z","0.15.1-3548c99":"2023-01-12T17:14:39.690Z","0.15.1-a1b76f5":"2023-01-13T10:34:54.150Z","0.15.1":"2023-01-13T12:08:32.120Z","0.15.1-656bcc3":"2023-01-13T14:23:50.630Z","0.15.1-6879c1d":"2023-01-14T10:53:53.981Z","0.15.1-1766537":"2023-01-14T11:29:27.963Z","0.15.1-2b4d90d":"2023-01-14T11:49:15.653Z","0.15.2":"2023-01-16T14:07:41.484Z","0.15.2-52e75f5":"2023-01-16T14:40:50.780Z","0.15.3-c675dde":"2023-01-16T14:56:23.971Z","0.15.3":"2023-01-16T15:01:39.553Z","0.15.3-1e62a3e":"2023-01-16T16:08:22.594Z","0.15.3-72fb2c0":"2023-01-16T16:43:34.302Z","0.15.3-23baedd":"2023-01-16T18:07:07.619Z","0.15.3-844cb31":"2023-01-16T18:48:12.954Z","0.15.3-98b2097":"2023-01-16T20:00:49.792Z","0.15.3-0dcbb16":"2023-01-16T20:01:26.797Z","0.15.3-335d188":"2023-01-17T19:34:25.367Z","0.15.3-b422bc1":"2023-01-18T15:51:54.547Z","0.15.3-b3dd40c":"2023-01-18T16:04:41.255Z","0.15.3-71be15e":"2023-01-18T16:19:59.391Z","0.15.3-30915c1":"2023-01-18T16:21:20.208Z","0.15.3-36368e7":"2023-01-19T08:15:22.674Z","0.15.3-adba448":"2023-01-19T09:14:01.179Z","0.15.3-bbe577c":"2023-01-19T10:13:07.484Z","0.15.3-1c43305":"2023-01-19T10:58:59.509Z","0.15.3-f77c6c2":"2023-01-19T11:02:25.461Z","0.15.3-1f6c448":"2023-01-19T11:04:52.742Z","0.15.3-d8f67aa":"2023-01-19T11:08:20.974Z","0.16.0-11f7ff3":"2023-01-19T17:05:26.040Z","0.16.0-3e17d6e":"2023-01-19T19:42:56.650Z","0.16.0":"2023-01-19T19:51:17.192Z","0.16.1-56d16f9":"2023-01-19T20:31:37.496Z","0.16.1-b4b5a09":"2023-01-19T20:40:08.551Z","0.16.1-ddf4681":"2023-01-19T20:50:20.776Z","0.16.0-484a8ae":"2023-01-20T07:52:17.638Z","0.16.0-af45b90":"2023-01-20T13:20:47.687Z","0.16.0-b9e9ba0":"2023-01-20T13:39:26.320Z","0.16.0-4124cf0":"2023-01-20T13:48:40.737Z","0.16.0-51c77ba":"2023-01-20T13:50:56.890Z","0.16.1-cf5a510":"2023-01-20T14:47:42.979Z","0.16.1":"2023-01-20T14:55:51.726Z","0.16.1-c522f26":"2023-01-20T15:03:07.755Z","0.16.1-97f9977":"2023-01-21T11:16:28.355Z","0.16.1-43776eb":"2023-01-22T13:31:27.712Z","0.16.1-2c4c5b1":"2023-01-24T07:10:46.283Z","0.16.2-60d4ce6":"2023-01-24T07:19:23.899Z","0.16.2":"2023-01-24T07:37:24.314Z","0.16.2-78fb61e":"2023-01-25T21:00:07.449Z"},"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 MySQL database","homepage":"https://github.com/drizzle-team/drizzle-orm#readme","keywords":["orm","mysql","database","sql","typescript","drizzle","drizzle-orm","drizzle-orm-mysql"],"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"}}