{"id":47884,"date":"2023-07-28T00:43:15","date_gmt":"2023-01-19T17:02:04","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/"},"modified":"2024-04-30T15:41:34","modified_gmt":"2024-04-30T07:41:34","slug":"node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/","title":{"rendered":"Node.js\uff06GraphQL \u7b2c3\u90e8\u5206\uff1aPrisma\u914d\u7f6e\uff5e"},"content":{"rendered":"<h1>\u524d\u63d0 (qianti)<\/h1>\n<p>\u5b8c\u5168\u4e3a\u81ea\u5df1\u8bb0\u5f55\u7684\u7b14\u8bb0\u3002\u64cd\u4f5c\u7cfb\u7edf\u662fWindows10\u3002\u6570\u636e\u5e93\u662fPostgreSQL\u3002<br \/>\n\u5c1a\u672a\u4e0eNodejs\u8fde\u63a5\u3002<\/p>\n<h1>\u666e\u745e\u65af\u739b<\/h1>\n<p>\u8fde\u63a5\u670d\u52a1\u5668\u548c\u6570\u636e\u5e93\u7684GraphQL ORM\uff08\u5bf9\u8c61\u5173\u7cfb\u6620\u5c04\uff09\u3002<br \/>\n\u867d\u7136\u4e5f\u6709\u672c\u5730\u9a71\u52a8\u7a0b\u5e8f\uff0c\u4f46\u7531\u4e8e\u529f\u80fd\u66f4\u5f3a\u5927\uff0c\u6240\u4ee5\u4f7f\u7528Prisma\uff08\u4f8b\u5982\u8fc1\u79fb\u548c\u9a8c\u8bc1\u975e\u5e38\u65b9\u4fbf\uff09\u3002<br \/>\n\u5b83\u5305\u88c5\u6570\u636e\u5e93\u5e76\u516c\u5f00\u4e3aGraphQL API\uff0c\u53ef\u4ee5\u7528\u4e8e\u4efb\u4f55\u7c7b\u578b\u7684\u6570\u636e\u5e93\u3002<br \/>\n\u4e5f\u53ef\u4ee5\u4f7f\u7528\u5176\u4ed6ORM\uff08\u5982Sequelize\u6216Mongoose\uff09\uff0c\u4f46\u7531\u4e8e\u4e0a\u8ff0\u539f\u56e0\uff0cPrisma\u66f4\u7075\u6d3b\uff0c\u6240\u4ee5\u4e3a\u4ec0\u4e48\u4e0d\u7528Prisma\u5462\u3002<br \/>\n\u901a\u8fc7GraphQL\u53ef\u4ee5\u7edf\u4e00\u5ba2\u6237\u7aef-\u670d\u52a1\u5668\u548c\u670d\u52a1\u5668-\u6570\u636e\u5e93\u4e4b\u95f4\u7684\u901a\u4fe1\uff0c\u8fd9\u6837\u670d\u52a1\u5668\u7684\u89d2\u8272\u4f1a\u53d8\u5f97\u8584\u5f31\u8d77\u6765\u3002\u53ea\u9700\u5c06\u5ba2\u6237\u7aef\u7684GraphQL\u67e5\u8be2\u4f20\u9012\u7ed9Prisma\uff0c\u7136\u540e\u5c06\u8fd4\u56de\u7684\u6570\u636e\u76f4\u63a5\u4f20\u9012\u7ed9\u5ba2\u6237\u7aef\uff08\u9700\u8981\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\uff09\u7684\u611f\u89c9\u3002<\/p>\n<h1>Prisma \u8bbe\u7f6e\u5b8c\u6210<\/h1>\n<h3>Heroku\u4e2d\u7684PostgreSQL<\/h3>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u767b\u5f55Heroku\u540e\uff0c\u70b9\u51fb\u201cCreate new app\u201d\uff0c\u4e0d\u8fdb\u884c\u4efb\u4f55\u7279\u6b8a\u8bbe\u7f6e\u6765\u521b\u5efa\u5e94\u7528\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8f6c\u5230\u521b\u5efa\u7684\u5e94\u7528\u9875\u9762\uff0c\u5207\u6362\u5230\u201cOverview\u201d\u9009\u9879\u5361\u3002\u5728\u201cInstalled add-ons\u201d\u9009\u9879\u4e2d\u9009\u62e9\u201cConfigure Add-ons\u201d\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5728\u201cAdd-ons\u201d\u7684\u641c\u7d22\u6846\u4e2d\u641c\u7d22\u201cHeroku PostgreSQL\u201d\uff0c\u7136\u540e\u9009\u62e9\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u9009\u62e9\u201cHobby Dev &#8211; Free\u201d\u514d\u8d39\u8ba1\u5212\u6765\u521b\u5efa\u5e76\u914d\u7f6e\u6570\u636e\u5e93\u3002<\/ol>\n<h3>PostgreSQL\u56fe\u5f62\u7528\u6237\u754c\u9762 (pgAdmin)<\/h3>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u60a8\u53ef\u4ee5\u5728\u4ee5\u4e0b\u94fe\u63a5\u4e2d\u4e0b\u8f7d\u6700\u65b0\u7684pgAdmin\uff08\u70b9\u51fb\u4e0b\u8f7dxxx.exe\u6587\u4ef6\uff09<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u6267\u884cexe\u6587\u4ef6\u5e76\u6309\u9ed8\u8ba4\u8bbe\u7f6e\u8fdb\u884c\u5b89\u88c5<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8fd0\u884cpgAdmin\u540e\uff0cGUI\u754c\u9762\u5c06\u5728\u6d4f\u89c8\u5668\u7684\u9009\u9879\u5361\u4e2d\u6253\u5f00<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5728GUI\u754c\u9762\u4e0a\u9009\u62e9\u201c\u6dfb\u52a0\u65b0\u670d\u52a1\u5668\u201d\uff0c\u7136\u540e\u5728\u8fde\u63a5\u9009\u9879\u5361\u4e0a\u8f93\u5165\u9002\u5f53\u7684\u540d\u79f0<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u4eceHeroku\u7684\u6570\u636e\u5e93\u9875\u9762\u4e2d\u9009\u62e9\u201c\u6570\u636e\u5e93\u51ed\u636e\u201d\u90e8\u5206\uff0c\u5c06\u5176\u4e2d\u7684\u4e3b\u673a\u540d\u590d\u5236\u5e76\u7c98\u8d34\u5230\u8fde\u63a5\u9009\u9879\u5361\u7684\u201c\u4e3b\u673a\u540d\/\u5730\u5740\u201d\u4e2d<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u7aef\u53e3\u4e0eHeroku\u7684\u9ed8\u8ba4\u8bbe\u7f6e\u76f8\u540c\uff0c\u65e0\u9700\u66f4\u6539<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u4eceHeroku\u7684\u201c\u6570\u636e\u5e93\u51ed\u636e\u201d\u4e2d\u590d\u5236\u6570\u636e\u5e93\u3001\u7528\u6237\u548c\u5bc6\u7801\uff0c\u7136\u540e\u5206\u522b\u7c98\u8d34\u5230\u8fde\u63a5\u9009\u9879\u5361\u7684\u201c\u7ef4\u62a4\u6570\u636e\u5e93\/\u7528\u6237\u540d\/\u5bc6\u7801\u201d\u4e2d<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5982\u679c\u65b9\u4fbf\u7684\u8bdd\uff0c\u53ef\u4ee5\u52fe\u9009\u201c\u4fdd\u5b58\u5bc6\u7801\u201d<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8f93\u5165\u5b8c\u6210\u540e\uff0c\u70b9\u51fb\u201c\u4fdd\u5b58\u201d\u21d2\u5c06\u81ea\u52a8\u5f00\u59cb\u8fde\u63a5\u6d4b\u8bd5<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u6210\u529f\u8fde\u63a5\u540e\uff0c\u4f9d\u6b21\u6253\u5f00\u201c\u670d\u52a1\u5668\u201d\u21d2\u201c\u81ea\u5b9a\u4e49\u7684\u670d\u52a1\u5668\u540d\u79f0\u201d\u21d2\u201c\u6570\u636e\u5e93\u201d\u3002\u5728\u6211\u81ea\u5df1\u7684\u60c5\u51b5\u4e0b\uff0c\u6709\u5927\u7ea66000\u4e2a\u6570\u636e\u5e93\uff0c\u6240\u4ee5\u6211\u4f7f\u7528Ctrl+F\u5728\u201c\u6570\u636e\u5e93\u51ed\u636e\u201d\u4e2d\u641c\u7d22\u4ee5\u627e\u5230\u76f8\u5e94\u7684\u6570\u636e\u5e93\u3002<\/ol>\n<h3>Docker: \u955c\u50cf\u5bb9\u5668\u5316\u5e73\u53f0<\/h3>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8bf7\u4ecehttps:\/\/www.docker.com\/get-started\u4e0a\u4e0b\u8f7dDocker Toolbox<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u6267\u884c.exe\u6587\u4ef6\u8fdb\u884c\u5b89\u88c5\uff08\u5168\u90e8\u9ed8\u8ba4\u8bbe\u7f6e\uff09<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u6253\u5f00Docker QuickStart Terminal\u5e76\u81ea\u52a8\u5f00\u59cb\u521d\u59cb\u5316\u5904\u7406<\/ol>\n<h3>\u666e\u5229\u65af\u739b<\/h3>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5728\u4e2d\u56fd\uff0c\u53ea\u9700\u8981\u4e00\u4e2a\u9009\u9879\u6765\u8868\u8fbe\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u4f7f\u7528npm install -g prisma\u5168\u5c40\u5b89\u88c5Prisma<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u901a\u8fc7prisma -v\u786e\u8ba4\u5b89\u88c5\u60c5\u51b5<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5728\u9879\u76ee\u6587\u4ef6\u5939\u4e2d\u8fd0\u884cprisma init [\u9879\u76ee\u540d]<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5bf9\u63d0\u793a\u8fdb\u884c\u4ee5\u4e0b\u56de\u7b54\uff1a<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u4f7f\u7528\u73b0\u6709\u6570\u636e\u5e93\u21d2PostgreSQL\u21d2\u5426\uff08\u5bf9\u4e8e\u6570\u636e\u5e93\u4e2d\u662f\u5426\u5305\u542b\u73b0\u6709\u6570\u636e\u7684\u95ee\u9898\uff09<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8bbe\u7f6e\u65b0\u7684Prisma\u670d\u52a1\u5668\u8fd8\u662f\u90e8\u7f72\u5230\u73b0\u6709\u670d\u52a1\u5668\uff1f\u21d2\u4f7f\u7528\u73b0\u6709\u6570\u636e\u5e93<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8981\u90e8\u7f72\u5230\u54ea\u79cd\u7c7b\u578b\u7684\u6570\u636e\u5e93\uff1f\u21d2PostgreSQL<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u4f60\u7684\u6570\u636e\u5e93\u4e2d\u662f\u5426\u5305\u542b\u73b0\u6709\u6570\u636e\uff1f\u21d2\u5426<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8f93\u5165\u6570\u636e\u5e93\u4e3b\u673a\u21d2Heroku\u6570\u636e\u5e93\u51ed\u636e\u4e2d\u7684\u4e3b\u673a<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8f93\u5165\u6570\u636e\u5e93\u7aef\u53e3\u21d25432<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8f93\u5165\u6570\u636e\u5e93\u7528\u6237\u21d2Heroku\u6570\u636e\u5e93\u51ed\u636e\u4e2d\u7684\u7528\u6237<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8f93\u5165\u6570\u636e\u5e93\u5bc6\u7801\u21d2Heroku\u6570\u636e\u5e93\u51ed\u636e\u4e2d\u7684\u5bc6\u7801<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8f93\u5165\u6570\u636e\u5e93\u540d\u79f0\uff08\u6570\u636e\u5e93\u5305\u62ec\u67b6\u6784\uff09\u21d2Heroku\u6570\u636e\u5e93\u51ed\u636e\u4e2d\u7684\u6570\u636e\u5e93<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u4f7f\u7528SSL\uff1f\u21d2\u662f<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u9009\u62e9\u751f\u6210\u7684Prisma\u5ba2\u6237\u7aef\u7684\u7f16\u7a0b\u8bed\u8a00\u21d2\u4e0d\u751f\u6210<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u5c06\u521b\u5efaprisma\u6587\u4ef6\u5939\u548c3\u4e2a\u6587\u4ef6<\/ol>\n<p>\u30fbdatamodel.prisma \u21d2 \u8fd9\u662f\u4e00\u4e2a\u7528\u4e8eGraphQL\u7684\u7c7b\u578b\u5b9a\u4e49\u6587\u4ef6\uff08\u7c7b\u4f3c\u4e8eschema.graphql\uff09\u3002Prisma\u4f7f\u7528\u6b64\u6587\u4ef6\u6765\u786e\u5b9a\u6570\u636e\u5e93\u7ed3\u6784\u3002<br \/>\n\u30fbdocker-compose.yml \u21d2 \u8fd9\u662fDocker\u7684\u914d\u7f6e\u6587\u4ef6\u3002<br \/>\n\u30fbprisma.yml \u21d2 \u8fd9\u662f\u7528\u4e8ePrisma\u7684\u5b9a\u4e49\u6587\u4ef6\u3002<br \/>\n\u203byml\u6587\u4ef6 \u21d2 \u8fd9\u662f\u4e00\u79cd\u7c7b\u4f3c\u4e8ejson\u6587\u4ef6\u7684\u952e\u503c\u5bf9\u6587\u4ef6\u3002\u5e38\u7528\u4e8e\u914d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">3'<\/span> <span class=\"c1\"># Docker\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\uff08\u4ee5\u4e0b\u306b\u7d9a\u304f\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u6c7a\u5b9a\u3059\u308b\uff09<\/span>\r\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>  <span class=\"c1\"># \u4f7f\u7528\u3059\u308b\u30b5\u30fc\u30d3\u30b9\uff08\u4eca\u56de\u306fPrisma\u3060\u3051\uff09<\/span>\r\n  <span class=\"na\">prisma<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prismagraphql\/prisma:1.29<\/span>  <span class=\"c1\"># \u4f7f\u7528\u3059\u308b Docker Container<\/span>\r\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>  <span class=\"c1\"># restart when deploy new changes<\/span>\r\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>  <span class=\"c1\"># \u4f7f\u7528\u3059\u308b\u30dd\u30fc\u30c8<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">4466:4466\"<\/span>\r\n    <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">PRISMA_CONFIG<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>  <span class=\"c1\"># Prisma\u306e\u30b3\u30f3\u30d5\u30a3\u30b0<\/span>\r\n        <span class=\"s\">port: 4466<\/span>\r\n        <span class=\"s\"># uncomment the next line and provide the env var PRISMA_MANAGEMENT_API_SECRET=my-secret to activate cluster security<\/span>\r\n        <span class=\"s\"># managementApiSecret: my-secret<\/span>\r\n        <span class=\"s\">databases:   # \u4f7f\u7528\u3059\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9<\/span>\r\n          <span class=\"s\">default:<\/span>\r\n            <span class=\"s\">connector: postgres<\/span>\r\n            <span class=\"s\">host: xxx<\/span>\r\n            <span class=\"s\">database: xxx<\/span>\r\n            <span class=\"s\">ssl: true   # \u30d7\u30ed\u30f3\u30d7\u30c8\u3067\u805e\u304b\u308c\u305f\u306e\u306b\u66f8\u304b\u308c\u3066\u3044\u306a\u304b\u3063\u305f\u306e\u3067\u8ffd\u8a18\u3057\u3066\u304a\u304f<\/span>\r\n            <span class=\"s\">user: xxx<\/span>\r\n            <span class=\"s\">password: xxx<\/span>\r\n            <span class=\"s\">rawAccess: true<\/span>\r\n            <span class=\"s\">port: '5432'<\/span>\r\n            <span class=\"s\">migrations: true<\/span>\r\n<\/code><\/pre>\n<h3>\u90e8\u7f72 (b\u00f9 sh\u01d4)<\/h3>\n<ol>\u5728\u8fd0\u884c`prisma init`\u547d\u4ee4\u540e\uff0c\u63a7\u5236\u53f0\u4e0a\u4f1a\u663e\u793a\u4ee5\u4e0b\u6b65\u9aa4\uff0c\u8bf7\u6309\u7167\u6b65\u9aa4\u64cd\u4f5c\u3002<\/ol>\n<pre class=\"post-pre\"><code>Next steps:\r\n  1. Open folder: cd prisma\r\n  2. Start your Prisma server: docker-compose up -d\r\n  3. Deploy your Prisma service: prisma deploy\r\n<\/code><\/pre>\n<p>\u30fbdocker-compose up -d \u21d2 \u5b89\u88c5\u8fd0\u884cPrisma\u6240\u9700\u7684\u4ee3\u7801 \u21d2 \u5728\u865a\u62df\u673a\u4e2d\u542f\u52a8Prisma<br \/>\n\u30fbprisma deploy \u21d2 \u90e8\u7f72\u6700\u65b0\u66f4\u6539\uff08\u4f8b\u5982\uff0c\u5982\u679c\u4fee\u6539\u4e86datamodel.prisma\uff0c\u5219\u901a\u8fc7prisma deploy\u5c06\u66f4\u6539\u90e8\u7f72\u5230Prisma\uff0c\u5e76\u5e94\u7528\u4e8e\u6570\u636e\u5e93\uff09<br \/>\n\u30fb\u7531\u4e8e\u547d\u4ee4\u65e0\u6cd5\u8bc6\u522b\uff0c\u53ef\u4ee5\u4ee5\u7ba1\u7406\u5458\u6743\u9650\u8fd0\u884ccmd\u4ee5\u89e3\u51b3\u95ee\u9898<br \/>\n\u30fb\u5728\u6267\u884cprisma deploy\u4e4b\u524d\uff0c\u8bf7\u5c06prisma.yml\u6309\u4ee5\u4e0b\u65b9\u5f0f\u4fee\u6539<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">endpoint<\/span><span class=\"pi\">:<\/span> <span class=\"s\">http:\/\/[Docker QuickStart Terminal\u3067\u8868\u793a\u3055\u308c\u308bIP\u30a2\u30c9\u30ec\u30b9]:4466<\/span>\r\n<span class=\"na\">datamodel<\/span><span class=\"pi\">:<\/span> <span class=\"s\">datamodel.prisma<\/span>\r\n<\/code><\/pre>\n<ol>\u4e00\u65e6\u6267\u884c\u5b8cprisma deploy\u540e\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u8bbf\u95ee[Docker QuickStart\u7ec8\u7aef\u663e\u793a\u7684IP\u5730\u5740]:4466\u6765\u8fdb\u5165GraphQL Playground\uff08\u76ee\u524d\u8be5Playground\u8fde\u63a5\u5230\u4e86Prisma\u63d0\u4f9b\u7684GraphQL API\uff09\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e2aPlayground\u4e2d\u6267\u884cMutation\u6765\u5b9e\u9645\u4fee\u6539PostgreSQL\u6570\u636e\u5e93\u3002Prisma\u4f1a\u6839\u636edatamodel.prisma\u4e2d\u5b9a\u4e49\u7684Type\u548c\u5b57\u6bb5\u81ea\u52a8\u521b\u5efaQuery\/Mutation\/Subscription\uff0c\u771f\u662f\u592a\u68d2\u4e86\u3002<\/ol>\n<pre class=\"post-pre\"><code>type User {\r\n  id: ID! @unique \/\/ @unique\u306f directives \u3068\u3044\u3063\u3066\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u5236\u7d04\u3092\u304b\u3051\u3089\u308c\u308b\u4ee3\u7269\r\n  name: String!\r\n}\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8204913a08637a6aeb02\/22-0.jpeg\" alt=\"\u30ad\u30e3\u30d7\u30c1\u30e3.JPG\" \/><\/div>\n<p>\u5728\u8fd9\u4e2aPlayground\u4e0a\u8fdb\u884c\u4e86Mutation\u64cd\u4f5c\u540e\uff0cHeroku\u7684PostgreSQL\u6570\u636e\u5e93\u5c06\u5b9e\u9645\u53d1\u751f\u66f4\u6539\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8204913a08637a6aeb02\/24-1.jpeg\" alt=\"\u30ad\u30e3\u30d7\u30c1\u30e3.JPG\" \/><\/div>\n<h5>\u6570\u636e\u5e93\u7ed3\u6784\u7684\u66f4\u65b0<\/h5>\n<p>\u66f4\u65b0datamodel.prisma\u540e\uff0c\u6267\u884c&#8221;prisma deploy&#8221;\u6307\u4ee4\uff0c\u5c06\u5176\u5e94\u7528\u4e8e\u6570\u636e\u5e93\u548cGraphQL API\u3002<\/p>\n<h3>\u4f7f\u7528Node.js\u8fdb\u884c\u8fde\u63a5<\/h3>\n<pre class=\"post-pre\"><code>npm install prisma-binding\r\nnpm install -g graphql-cli\r\n<\/code><\/pre>\n<p>\u30fbprisma-binding\u662f\u4e00\u4e2a\u63d0\u4f9b\u7ed9Node.js\u7684\u5e93\uff0c\u7528\u4e8e\u64cd\u4f5cPrisma GraphQL API\u3002<br \/>\nhttps:\/\/github.com\/prisma\/prisma-binding<\/p>\n<p>\u30fbgraphql-cli \u21d2 GraphQL\u547d\u4ee4\u884c\u754c\u9762\uff08\u7528\u4e8e\u83b7\u53d6\u6a21\u5f0f\uff09<br \/>\nhttps:\/\/github.com\/graphql-cli\/graphql-cli<\/p>\n<p>\u7531\u4e8ePrisma\u9ed8\u8ba4\u4eceProjectRoot\/prisma\/datamodel.prisma\u5904\u83b7\u53d6Schema\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u4f7f\u7528graphql-cli\u6765\u5c06fetch\u6e90\u66f4\u6539\u4e3aProjectRoot\/src\/generated\/prisma.graphql\u3002<\/p>\n<p>\u5c06.graphqlconfig\u6587\u4ef6\u4e2d\u6307\u5b9a\u7684Schema\u83b7\u53d6\u4f4d\u7f6e\u548c\u4fdd\u5b58Type\u5b9a\u4e49\u7684\u4f4d\u7f6e\u663e\u793a\u51fa\u6765\u3002<\/p>\n<h3>\u5de5\u4f5c\u6d41\u7a0b<\/h3>\n<p>1. \u66f4\u65b0 ProjectRoot\/prisma\/datamodel.prisma \u6587\u4ef6\u4ee5\u66f4\u6539\u7c7b\u578b\u5b9a\u4e49\u3002<br \/>\n2. \u6267\u884c\u300cprisma deploy\u300d\u4ee5\u5c06\u66f4\u6539\u5e94\u7528\u5230\u6570\u636e\u5e93\u3002<br \/>\n3. \u4f7f\u7528\u300cnpm run get-schema\u300d\u4ece ProjectRoot\/src\/generated\/prisma.graphql \u83b7\u53d6\u6700\u65b0\u7684 Schema\uff0c\u5e76\u81ea\u52a8\u5c06\u5305\u542b\u6240\u9700\u7c7b\u578b\u7684\u6587\u4ef6\u751f\u6210\u5230 ProjectRoot\/generated\/prisma.graphql\u3002<br \/>\n\u203b \u5982\u679c\u5728\u6267\u884c\u300cprisma deploy\u300d\u65f6\u51fa\u73b0\u4e86 internal server error\uff0c\u8bf7\u68c0\u67e5\u4e0e\u6570\u636e\u5e93\u7684\u8fde\u63a5\u3002\u5982\u679c\u65e0\u6cd5\u4ece pgAdmin \u4e2d\u786e\u8ba4\u6570\u636e\u5e93\u8868\u683c\uff0c\u8bf7\u5173\u95ed\u4e00\u6b21 pgAdmin\u3002<br \/>\n\u203b \u5f53 Prisma \u7248\u672c\u8fc7\u4e8e\u6700\u65b0\u65f6\uff0c\u53ef\u80fd\u4f1a\u51fa\u73b0\u9519\u8bef\uff0c\u56e0\u6b64\u6211\u4eec\u964d\u4f4e\u4e86\u5b83\u7684\u7248\u672c\u3002<\/p>\n<hr \/>\n<p>\u203b \u4e0d\u77e5\u4e3a\u4f55 prisma \u7684\u6307\u4ee4\u672a\u80fd\u751f\u6548\uff08\u7ea7\u8054\u5173\u7cfb\u7684CASCADE\/\u8bbe\u7f6e\u4e3aNULL\u672a\u80fd\u751f\u6548\uff09\uff0c\u4e0d\u8fc7\u901a\u8fc7\u4ee5\u4e0b\u65b9\u5f0f\u8fdb\u884c\u4e86\u66f4\u6539\u5e76\u89e3\u51b3\u4e86\u95ee\u9898\uff1a<br \/>\n1. \u5c06 datamodel.prisma \u66f4\u6539\u4e3a datamodel.graphql\uff08\u5185\u5bb9\u672a\u505a\u6539\u52a8\uff09\u3002<br \/>\n2. \u5c06 prisma.yml \u66f4\u6539\u5982\u4e0b\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">endpoint<\/span><span class=\"pi\">:<\/span> <span class=\"s\">http:\/\/[Docker QuickStart Terminal\u3067\u8868\u793a\u3055\u308c\u308bIP\u30a2\u30c9\u30ec\u30b9]:4466<\/span>\r\n<span class=\"na\">datamodel<\/span><span class=\"pi\">:<\/span> <span class=\"s\">datamodel.graphql<\/span>\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u63d0 (qianti) \u5b8c\u5168\u4e3a\u81ea\u5df1\u8bb0\u5f55\u7684\u7b14\u8bb0\u3002\u64cd\u4f5c\u7cfb\u7edf\u662fWindows10\u3002\u6570\u636e\u5e93\u662fPostgreSQL\u3002 \u5c1a [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-47884","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Node.js\uff06GraphQL \u7b2c3\u90e8\u5206\uff1aPrisma\u914d\u7f6e\uff5e - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/node-js\uff06graphql-\u7b2c3\u90e8\u5206\uff1aprisma\u914d\u7f6e\uff5e\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js\uff06GraphQL \u7b2c3\u90e8\u5206\uff1aPrisma\u914d\u7f6e\uff5e\" \/>\n<meta property=\"og:description\" content=\"\u524d\u63d0 (qianti) \u5b8c\u5168\u4e3a\u81ea\u5df1\u8bb0\u5f55\u7684\u7b14\u8bb0\u3002\u64cd\u4f5c\u7cfb\u7edf\u662fWindows10\u3002\u6570\u636e\u5e93\u662fPostgreSQL\u3002 \u5c1a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/node-js\uff06graphql-\u7b2c3\u90e8\u5206\uff1aprisma\u914d\u7f6e\uff5e\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-19T17:02:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T07:41:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8204913a08637a6aeb02\/22-0.jpeg\" \/>\n<meta name=\"author\" content=\"\u79d1, \u96c5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u96c5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/\",\"name\":\"Node.js\uff06GraphQL \u7b2c3\u90e8\u5206\uff1aPrisma\u914d\u7f6e\uff5e - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-01-19T17:02:04+00:00\",\"dateModified\":\"2024-04-30T07:41:34+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js\uff06GraphQL \u7b2c3\u90e8\u5206\uff1aPrisma\u914d\u7f6e\uff5e\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\",\"name\":\"\u79d1, \u96c5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u96c5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Node.js\uff06GraphQL \u7b2c3\u90e8\u5206\uff1aPrisma\u914d\u7f6e\uff5e - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/node-js\uff06graphql-\u7b2c3\u90e8\u5206\uff1aprisma\u914d\u7f6e\uff5e\/","og_locale":"zh_CN","og_type":"article","og_title":"Node.js\uff06GraphQL \u7b2c3\u90e8\u5206\uff1aPrisma\u914d\u7f6e\uff5e","og_description":"\u524d\u63d0 (qianti) \u5b8c\u5168\u4e3a\u81ea\u5df1\u8bb0\u5f55\u7684\u7b14\u8bb0\u3002\u64cd\u4f5c\u7cfb\u7edf\u662fWindows10\u3002\u6570\u636e\u5e93\u662fPostgreSQL\u3002 \u5c1a [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/node-js\uff06graphql-\u7b2c3\u90e8\u5206\uff1aprisma\u914d\u7f6e\uff5e\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-01-19T17:02:04+00:00","article_modified_time":"2024-04-30T07:41:34+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8204913a08637a6aeb02\/22-0.jpeg"}],"author":"\u79d1, \u96c5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u96c5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"2 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/","name":"Node.js\uff06GraphQL \u7b2c3\u90e8\u5206\uff1aPrisma\u914d\u7f6e\uff5e - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-01-19T17:02:04+00:00","dateModified":"2024-04-30T07:41:34+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js\uff06GraphQL \u7b2c3\u90e8\u5206\uff1aPrisma\u914d\u7f6e\uff5e"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a","name":"\u79d1, \u96c5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","caption":"\u79d1, \u96c5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/node-js%ef%bc%86graphql-%e7%ac%ac3%e9%83%a8%e5%88%86%ef%bc%9aprisma%e9%85%8d%e7%bd%ae%ef%bd%9e\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47884","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=47884"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47884\/revisions"}],"predecessor-version":[{"id":92789,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47884\/revisions\/92789"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=47884"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=47884"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=47884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}