{"id":827,"date":"2023-05-25T14:08:01","date_gmt":"2023-08-23T16:04:04","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/index.php\/2023\/11\/30\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0digitalocean%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/"},"modified":"2025-08-03T11:27:38","modified_gmt":"2025-08-03T03:27:38","slug":"%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/","title":{"rendered":"Prisma\u6784\u5efaGraphQL API\u5b8c\u6574\u6307\u5357\uff1aSilicon Cloud\u5e73\u53f0\u90e8\u7f72\u6559\u7a0b"},"content":{"rendered":"<h3>\u5f15\u8a00<\/h3>\n<p>GraphQL\u662f\u4e00\u79cd\u7528\u4e8eAPI\u7684\u67e5\u8be2\u8bed\u8a00\uff0c\u7531\u6a21\u5f0f\u5b9a\u4e49\u8bed\u8a00\u548c\u67e5\u8be2\u8bed\u8a00\u7ec4\u6210\uff0c\u5141\u8bb8API\u6d88\u8d39\u8005\u4ec5\u83b7\u53d6\u4ed6\u4eec\u9700\u8981\u7684\u6570\u636e\u4ee5\u652f\u6301\u7075\u6d3b\u7684\u67e5\u8be2\u3002GraphQL\u4f7f\u5f00\u53d1\u4eba\u5458\u80fd\u591f\u6839\u636e\u591a\u4e2a\u5ba2\u6237\u7aef\u7684\u4e0d\u540c\u9700\u6c42\u6765\u53d1\u5c55API\uff0c\u4f8b\u5982iOS\u3001Android\u548cWeb\u5e94\u7528\u7684\u53d8\u4f53\u3002\u6b64\u5916\uff0cGraphQL\u6a21\u5f0f\u4e3aAPI\u6dfb\u52a0\u4e86\u4e00\u5b9a\u7a0b\u5ea6\u7684\u7c7b\u578b\u5b89\u5168\u6027\uff0c\u540c\u65f6\u4e5f\u4f5c\u4e3aAPI\u7684\u4e00\u79cd\u6587\u6863\u5f62\u5f0f\u3002<\/p>\n<p>Prisma\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u6570\u636e\u5e93\u5de5\u5177\u5305\uff0c\u4e3b\u8981\u5305\u542b\u4e09\u4e2a\u6838\u5fc3\u5de5\u5177\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>Prisma Client\uff1a\u4e3aNode.js\u548cTypeScript\u81ea\u52a8\u751f\u6210\u4e14\u7c7b\u578b\u5b89\u5168\u7684\u67e5\u8be2\u6784\u5efa\u5668\u3002<\/li>\n<li>Prisma Migrate\uff1a\u58f0\u660e\u5f0f\u6570\u636e\u5efa\u6a21\u548c\u8fc1\u79fb\u7cfb\u7edf\u3002<\/li>\n<li>Prisma Studio\uff1a\u7528\u4e8e\u67e5\u770b\u548c\u7f16\u8f91\u6570\u636e\u5e93\u4e2d\u6570\u636e\u7684\u56fe\u5f62\u7528\u6237\u754c\u9762\u3002<\/li>\n<\/ul>\n<p>Prisma\u4e3a\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u4eba\u5458\u63d0\u4f9b\u4fbf\u5229\uff0c\u4f7f\u5176\u80fd\u591f\u4e13\u6ce8\u4e8e\u5b9e\u73b0\u589e\u503c\u529f\u80fd\uff0c\u800c\u4e0d\u5fc5\u82b1\u8d39\u65f6\u95f4\u5904\u7406\u590d\u6742\u7684\u6570\u636e\u5e93\u5de5\u4f5c\u6d41\u7a0b\uff08\u4f8b\u5982\u6a21\u5f0f\u8fc1\u79fb\u6216\u7f16\u5199\u590d\u6742\u7684SQL\u67e5\u8be2\uff09\u3002<\/p>\n<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u60a8\u5c06\u540c\u65f6\u4f7f\u7528GraphQL\u548cPrisma\uff0c\u56e0\u4e3a\u5b83\u4eec\u7684\u804c\u8d23\u4e92\u8865\u3002GraphQL\u4e3a\u60a8\u7684\u6570\u636e\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7075\u6d3b\u7684\u63a5\u53e3\uff0c\u4f9b\u524d\u7aef\u548c\u79fb\u52a8\u5e94\u7528\u7b49\u5ba2\u6237\u7aef\u4f7f\u7528\uff0c\u5b83\u4e0e\u4efb\u4f55\u7279\u5b9a\u6570\u636e\u5e93\u65e0\u5173\u3002\u8fd9\u5c31\u662fPrisma\u6d3e\u4e0a\u7528\u573a\u7684\u5730\u65b9\uff0c\u5b83\u8d1f\u8d23\u4e0e\u5c06\u5b58\u50a8\u60a8\u7684\u6570\u636e\u7684\u6570\u636e\u5e93\u8fdb\u884c\u4ea4\u4e92\u3002<\/p>\n<p>Silicon Cloud\u7684\u5e94\u7528\u5e73\u53f0\u63d0\u4f9b\u4e86\u4e00\u79cd\u65e0\u9700\u62c5\u5fc3\u57fa\u7840\u8bbe\u65bd\u7684\u65b9\u5f0f\u6765\u90e8\u7f72\u5e94\u7528\u7a0b\u5e8f\u548c\u6570\u636e\u5e93\u7684\u4e91\u7aef\u89e3\u51b3\u65b9\u6848\u3002\u8fd9\u51cf\u5c11\u4e86\u5728\u4e91\u7aef\u8fd0\u884c\u5e94\u7528\u7a0b\u5e8f\u7684\u64cd\u4f5c\u8d1f\u62c5\uff0c\u5c24\u5176\u662f\u901a\u8fc7\u80fd\u591f\u521b\u5efa\u5e26\u6709\u6bcf\u65e5\u5907\u4efd\u548c\u81ea\u52a8\u6545\u969c\u8f6c\u79fb\u529f\u80fd\u7684\u6258\u7ba1PostgreSQL\u6570\u636e\u5e93\u3002\u5e94\u7528\u5e73\u53f0\u5177\u6709\u672c\u5730Node.js\u652f\u6301\uff0c\u7b80\u5316\u4e86\u90e8\u7f72\u6d41\u7a0b\u3002<\/p>\n<p>\u4f60\u5c06\u4f7f\u7528Node.js\u4e2d\u7684JavaScript\u4e3a\u4e00\u4e2a\u535a\u5ba2\u5e94\u7528\u7a0b\u5e8f\u6784\u5efa\u4e00\u4e2aGraphQL API\u3002\u4f60\u5c06\u9996\u5148\u4f7f\u7528Apollo Server\u6784\u5efa\u652f\u6301\u5185\u5b58\u6570\u636e\u7ed3\u6784\u7684GraphQL API\u3002\u7136\u540e\uff0c\u4f60\u5c06\u90e8\u7f72API\u5230Silicon Cloud App\u5e73\u53f0\u4e0a\u3002\u6700\u540e\uff0c\u4f60\u5c06\u4f7f\u7528Prisma\u66ff\u6362\u5185\u5b58\u5b58\u50a8\uff0c\u5e76\u5c06\u6570\u636e\u6301\u4e45\u5316\u5230PostgreSQL\u6570\u636e\u5e93\uff0c\u5e76\u518d\u6b21\u90e8\u7f72\u8be5\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<p>\u5728\u6559\u7a0b\u7ed3\u675f\u65f6\uff0c\u4f60\u5c06\u62e5\u6709\u4e00\u4e2a\u90e8\u7f72\u5728Silicon Cloud\u4e0a\u7684Node.js GraphQL API\uff0c\u5b83\u53ef\u4ee5\u5904\u7406\u901a\u8fc7HTTP\u53d1\u9001\u7684GraphQL\u8bf7\u6c42\uff0c\u5e76\u5bf9PostgreSQL\u6570\u636e\u5e93\u6267\u884cCRUD\u64cd\u4f5c\u3002<\/p>\n<p>\u4f60\u53ef\u4ee5\u5728Silicon Cloud\u793e\u533a\u4ed3\u5e93\u4e2d\u627e\u5230\u8fd9\u4e2a\u9879\u76ee\u7684\u4ee3\u7801\u3002<\/p>\n<h2>\u5148\u51b3\u6761\u4ef6<\/h2>\n<p>\u5728\u4f60\u5f00\u59cb\u9605\u8bfb\u672c\u6307\u5357\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u51c6\u5907\u4ee5\u4e0b\u7269\u54c1\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>\u4e00\u4e2aGitHub\u8d26\u6237\u3002<\/li>\n<li>\u4e00\u4e2aSilicon Cloud\u8d26\u6237\u3002<\/li>\n<li>\u5728\u4f60\u7684\u8ba1\u7b97\u673a\u4e0a\u5b89\u88c5Git\u3002\u4f60\u53ef\u4ee5\u6309\u7167\u300a\u8d21\u732e\u5f00\u6e90\u9879\u76ee\uff1aGit\u5165\u95e8\u300b\u6559\u7a0b\u5728\u4f60\u7684\u8ba1\u7b97\u673a\u4e0a\u5b89\u88c5\u548c\u8bbe\u7f6eGit\u3002<\/li>\n<li>\u5728\u4f60\u7684\u8ba1\u7b97\u673a\u4e0a\u5b89\u88c5Node.js 14\u6216\u66f4\u9ad8\u7248\u672c\u3002\u4f60\u53ef\u4ee5\u6309\u7167\u300a\u5982\u4f55\u5b89\u88c5Node.js\u5e76\u521b\u5efa\u672c\u5730\u5f00\u53d1\u73af\u5883\u300b\u6559\u7a0b\u5728\u4f60\u7684\u8ba1\u7b97\u673a\u4e0a\u5b89\u88c5\u548c\u8bbe\u7f6eNode.js\u3002<\/li>\n<li>\u5728\u4f60\u7684\u8ba1\u7b97\u673a\u4e0a\u5b89\u88c5Docker\uff08\u7528\u4e8e\u5728\u672c\u5730\u8fd0\u884cPostgreSQL\u6570\u636e\u5e93\uff09\u3002<\/li>\n<\/ul>\n<p>\u5bf9\u4e8e\u8fd9\u4e2a\u6559\u7a0b\u6765\u8bf4\uff0c\u5bf9JavaScript\u3001Node.js\u3001GraphQL\u548cPostgreSQL\u6709\u57fa\u672c\u7684\u719f\u6089\u662f\u6709\u5e2e\u52a9\u7684\uff0c\u4f46\u4e0d\u662f\u5fc5\u9700\u7684\u3002<\/p>\n<h2>\u6b65\u9aa41 \u2014 \u521b\u5efaNode.js\u9879\u76ee<\/h2>\n<p>\u5728\u8fd9\u4e2a\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u4f7f\u7528npm\u6765\u8bbe\u7f6e\u4e00\u4e2aNode.js\u9879\u76ee\uff0c\u5e76\u5b89\u88c5apollo-server\u548cgraphql\u8fd9\u4e24\u4e2a\u4f9d\u8d56\u9879\u3002\u8be5\u9879\u76ee\u5c06\u6210\u4e3a\u60a8\u5728\u672c\u6559\u7a0b\u4e2d\u6784\u5efa\u548c\u90e8\u7f72GraphQL API\u7684\u57fa\u7840\u3002<\/p>\n<p>\u9996\u5148\uff0c\u4e3a\u60a8\u7684\u9879\u76ee\u521b\u5efa\u4e00\u4e2a\u65b0\u76ee\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">mkdir<\/span> prisma-graphql<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u8fdb\u5165\u8be5\u76ee\u5f55\u5e76\u521d\u59cb\u5316\u4e00\u4e2a\u7a7a\u7684npm\u9879\u76ee\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token builtin class-name\">cd<\/span> prisma-graphql<\/li>\n<li data-prefix=\"$\"><span class=\"token function\">npm<\/span> init <span class=\"token parameter variable\">&#8211;yes<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u8fd9\u4e2a\u547d\u4ee4\u4f1a\u521b\u5efa\u4e00\u4e2a\u6700\u57fa\u672c\u7684package.json\u6587\u4ef6\uff0c\u5b83\u4f5c\u4e3a\u60a8\u7684npm\u9879\u76ee\u7684\u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<p>\u60a8\u5c06\u6536\u5230\u5982\u4e0b\u8f93\u51fa\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Wrote to \/Users\/<mark>your_username<\/mark>\/workspace\/prisma-graphql\/package.json: { &#8220;name&#8221;: &#8220;prisma-graphql&#8221;, &#8220;version&#8221;: &#8220;1.0.0&#8221;, &#8220;description&#8221;: &#8220;&#8221;, &#8220;main&#8221;: &#8220;index.js&#8221;, &#8220;scripts&#8221;: { &#8220;test&#8221;: &#8220;echo \\&#8221;Error: no test specified\\&#8221; &#038;&#038; exit 1&#8243; }, &#8220;keywords&#8221;: [], &#8220;author&#8221;: &#8220;&#8221;, &#8220;license&#8221;: &#8220;ISC&#8221; }<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u73b0\u5728\u4f60\u53ef\u4ee5\u5f00\u59cb\u5728\u4f60\u7684\u9879\u76ee\u4e2d\u914d\u7f6eTypeScript\u4e86\u3002<\/p>\n<p>\u5b89\u88c5\u5fc5\u8981\u7684\u4f9d\u8d56\u9879\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> apollo-server graphql <span class=\"token parameter variable\">&#8211;save<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u8fd9\u4e2a\u547d\u4ee4\u4f1a\u5c06\u4e24\u4e2a\u8f6f\u4ef6\u5305\u5b89\u88c5\u4e3a\u60a8\u9879\u76ee\u7684\u4f9d\u8d56\u3002<\/p>\n<ul class=\"post-ul\">\n<li>apollo-server\u662fHTTP\u5e93\uff0c\u60a8\u5c06\u4f7f\u7528\u5b83\u6765\u5b9a\u4e49\u5982\u4f55\u89e3\u6790GraphQL\u8bf7\u6c42\u4ee5\u53ca\u5982\u4f55\u83b7\u53d6\u6570\u636e\u3002<\/li>\n<li>graphql\u662f\u60a8\u5c06\u7528\u6765\u6784\u5efaGraphQL\u6a21\u5f0f\u7684\u5e93\u3002<\/li>\n<\/ul>\n<p>\u4f60\u5df2\u7ecf\u521b\u5efa\u4e86\u4f60\u7684\u9879\u76ee\u5e76\u5b89\u88c5\u4e86\u6240\u6709\u7684\u4f9d\u8d56\u9879\u3002\u4e0b\u4e00\u6b65\uff0c\u4f60\u5c06\u5b9a\u4e49GraphQL\u6a21\u5f0f\u3002<\/p>\n<h2>\u6b65\u9aa42 &#8211; \u5b9a\u4e49GraphQL\u67b6\u6784\u548c\u89e3\u6790\u5668<\/h2>\n<p>\u5728\u8fd9\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u5b9a\u4e49GraphQL\u6a21\u5f0f\u548c\u76f8\u5e94\u7684\u89e3\u6790\u5668\u3002\u8be5\u6a21\u5f0f\u5c06\u5b9a\u4e49API\u53ef\u4ee5\u5904\u7406\u7684\u64cd\u4f5c\u3002\u89e3\u6790\u5668\u5c06\u4f7f\u7528\u5185\u5b58\u6570\u636e\u7ed3\u6784\u5b9a\u4e49\u5904\u7406\u8fd9\u4e9b\u8bf7\u6c42\u7684\u903b\u8f91\uff0c\u5728\u4e0b\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u7528\u6570\u636e\u5e93\u67e5\u8be2\u66ff\u6362\u8fd9\u4e9b\u89e3\u6790\u5668\u3002<\/p>\n<p>\u9996\u5148\uff0c\u521b\u5efa\u4e00\u4e2a\u540d\u4e3asrc\u7684\u65b0\u76ee\u5f55\uff0c\u7528\u6765\u5b58\u653e\u4f60\u7684\u6e90\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">mkdir<\/span> src<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u7136\u540e\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u6765\u521b\u5efa\u6a21\u5f0f\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> src\/schema.js<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5c06\u4ee5\u4e0b\u4ee3\u7801\u6dfb\u52a0\u5230\u6587\u4ef6\u4e2d\u3002<\/p>\n<div>prisma-graphql\u7684\u539f\u59cb\u7801\u4f4d\u7f6e\u5728\/src\/schema.js\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> gql <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">require<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'apollo-server'<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> typeDefs <span class=\"token operator\">=<\/span> gql<span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token graphql language-graphql\">\r\n  <span class=\"token keyword\">type<\/span> <span class=\"token class-name\">Post<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token attr-name\">content<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span>\r\n    <span class=\"token attr-name\">id<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">ID<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">published<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">Boolean<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">title<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token operator\">!<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n\r\n  <span class=\"token keyword\">type<\/span> <span class=\"token class-name\">Query<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token attr-name\">feed<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token class-name\">Post<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">post<\/span><span class=\"token punctuation\">(<\/span><span class=\"token attr-name\">id<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">ID<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Post<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n\r\n  <span class=\"token keyword\">type<\/span> <span class=\"token class-name\">Mutation<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token attr-name\">createDraft<\/span><span class=\"token punctuation\">(<\/span><span class=\"token attr-name\">content<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token attr-name\">title<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Post<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">publish<\/span><span class=\"token punctuation\">(<\/span><span class=\"token attr-name\">id<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">ID<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Post<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n<\/span><span class=\"token template-punctuation string\">`<\/span><\/span>\r\n<\/code><\/pre>\n<p>\u4f7f\u7528gql\u6807\u8bb0\u6a21\u677f\u6765\u5b9a\u4e49GraphQL schema\u3002schema\u662f\u4e00\u7ec4\u7c7b\u578b\u5b9a\u4e49\uff08\u5373typeDefs\uff09\uff0c\u5b83\u4eec\u5171\u540c\u5b9a\u4e49\u4e86\u53ef\u4ee5\u5bf9\u4f60\u7684API\u6267\u884c\u7684\u67e5\u8be2\u7684\u7ed3\u6784\u3002\u8fd9\u5c06\u628aGraphQL schema\u5b57\u7b26\u4e32\u8f6c\u6362\u4e3aApollo\u6240\u671f\u671b\u7684\u683c\u5f0f\u3002<\/p>\n<p>\u8be5\u6a21\u5f0f\u5f15\u5165\u4e86\u4e09\u79cd\u7c7b\u578b\u3002<\/p>\n<ul class=\"post-ul\">\n<li>Post\u5b9a\u4e49\u4e86\u535a\u5ba2\u5e94\u7528\u4e2d\u6587\u7ae0\u7684\u7c7b\u578b\uff0c\u5305\u542b\u56db\u4e2a\u5b57\u6bb5\uff0c\u6bcf\u4e2a\u5b57\u6bb5\u540e\u8ddf\u5176\u7c7b\u578b\uff1a\u4f8b\u5982\uff0cString\u3002<\/li>\n<li>Query\u5b9a\u4e49\u4e86feed\u67e5\u8be2\uff0c\u5b83\u8fd4\u56de\u591a\u7bc7\u6587\u7ae0\uff08\u7531\u65b9\u62ec\u53f7\u8868\u793a\uff09\uff0c\u4ee5\u53capost\u67e5\u8be2\uff0c\u5b83\u63a5\u53d7\u5355\u4e2a\u53c2\u6570\u5e76\u8fd4\u56de\u5355\u4e2aPost\u3002<\/li>\n<li>Mutation\u5b9a\u4e49\u4e86createDraft\u53d8\u66f4\uff0c\u7528\u4e8e\u521b\u5efa\u8349\u7a3fPost\uff0c\u4ee5\u53capublish\u53d8\u66f4\uff0c\u5b83\u63a5\u53d7\u4e00\u4e2aid\u5e76\u8fd4\u56de\u4e00\u4e2aPost\u3002<\/li>\n<\/ul>\n<p>\u6bcf\u4e2aGraphQL API\u90fd\u6709\u4e00\u4e2a\u67e5\u8be2\u7c7b\u578b\uff0c\u5e76\u4e14\u53ef\u80fd\u6709\u4e5f\u53ef\u80fd\u6ca1\u6709\u4e00\u4e2a\u53d8\u66f4\u7c7b\u578b\u3002\u8fd9\u4e9b\u7c7b\u578b\u4e0e\u5e38\u89c4\u5bf9\u8c61\u7c7b\u578b\u76f8\u540c\uff0c\u4f46\u5b83\u4eec\u5f88\u7279\u6b8a\uff0c\u56e0\u4e3a\u5b83\u4eec\u5b9a\u4e49\u4e86\u6bcf\u4e2aGraphQL\u67e5\u8be2\u7684\u5165\u53e3\u70b9\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u5728src\/schema.js\u6587\u4ef6\u4e2d\uff0c\u5728typeDefs\u53d8\u91cf\u4e0b\u65b9\u6dfb\u52a0posts\u6570\u7ec4\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token spread operator\">...<\/span>\r\n<span class=\"token keyword\">const<\/span> posts <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n  <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">title<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'Subscribe to GraphQL Weekly for community news '<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">content<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'https:\/\/graphqlweekly.com\/'<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">title<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'Follow Silicon Cloud on Twitter'<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">content<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'https:\/\/twitter.com\/digitalocean'<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">title<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'What is GraphQL?'<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">content<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">'GraphQL is a query language for APIs'<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token literal-property property\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n<span class=\"token punctuation\">]<\/span>\r\n<\/code><\/pre>\n<p>\u60a8\u4f7f\u7528\u4e09\u4e2a\u9884\u5b9a\u4e49\u7684\u5e16\u5b50\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5e16\u5b50\u6570\u7ec4\u3002\u6bcf\u4e2a\u5e16\u5b50\u5bf9\u8c61\u7684\u7ed3\u6784\u4e0e\u60a8\u5728\u6a21\u5f0f\u4e2d\u5b9a\u4e49\u7684&#8221;\u5e16\u5b50&#8221;\u7c7b\u578b\u76f8\u5339\u914d\u3002\u8fd9\u4e2a\u6570\u7ec4\u4fdd\u5b58\u7740API\u8981\u63d0\u4f9b\u7684\u5e16\u5b50\u6570\u636e\u3002\u5728\u63a5\u4e0b\u6765\u7684\u6b65\u9aa4\u4e2d\uff0c\u4e00\u65e6\u5f15\u5165\u6570\u636e\u5e93\u548cPrisma\u5ba2\u6237\u7aef\uff0c\u60a8\u5c06\u4f1a\u66ff\u6362\u8fd9\u4e2a\u6570\u7ec4\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u901a\u8fc7\u5728\u521a\u521a\u5b9a\u4e49\u7684posts\u6570\u7ec4\u4e0b\u65b9\u6dfb\u52a0\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6765\u5b9a\u4e49\u89e3\u6790\u5668\u5bf9\u8c61\u3002<\/p>\n<div>prisma-graphql\/src\/schema.js \u7684\u539f\u59cb\u4ee3\u7801\u9700\u8981\u6539\u5199\u6210\u4e2d\u6587\u3002\u53ea\u9700\u8981\u4e00\u79cd\u9009\u9879\uff1a<br \/>\nprisma-graphql\u76ee\u5f55\u4e2d\u7684schema.js\u6587\u4ef6<\/div>\n<pre class=\"post-pre\"><code><span class=\"token spread operator\">...<\/span>\r\n<span class=\"token keyword\">const<\/span> resolvers <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token literal-property property\">Query<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token function-variable function\">feed<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token keyword control-flow\">return<\/span> posts<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">filter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">post<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> post<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">published<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function-variable function\">post<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token keyword control-flow\">return<\/span> posts<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">post<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> post<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span> <span class=\"token operator\">===<\/span> <span class=\"token known-class-name class-name\">Number<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token literal-property property\">Mutation<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token function-variable function\">createDraft<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n      posts<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">push<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> posts<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">length<\/span> <span class=\"token operator\">+<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token literal-property property\">title<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">title<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token literal-property property\">content<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">content<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token literal-property property\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">,<\/span>\r\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n      <span class=\"token keyword control-flow\">return<\/span> posts<span class=\"token punctuation\">[<\/span>posts<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">length<\/span> <span class=\"token operator\">-<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function-variable function\">publish<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token keyword\">const<\/span> postToPublish <span class=\"token operator\">=<\/span> posts<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token parameter\">post<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> post<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span> <span class=\"token operator\">===<\/span> <span class=\"token known-class-name class-name\">Number<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n      postToPublish<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">published<\/span> <span class=\"token operator\">=<\/span> <span class=\"token boolean\">true<\/span>\r\n      <span class=\"token keyword control-flow\">return<\/span> postToPublish\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token literal-property property\">Post<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token function-variable function\">content<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> parent<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">content<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function-variable function\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> parent<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function-variable function\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> parent<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">published<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function-variable function\">title<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> parent<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">title<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\nmodule<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">exports<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span>\r\n  resolvers<span class=\"token punctuation\">,<\/span>\r\n  typeDefs<span class=\"token punctuation\">,<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4f60\u6309\u7167GraphQL\u6a21\u5f0f\u6765\u5b9a\u4e49\u89e3\u6790\u5668\u3002\u6a21\u5f0f\u4e2d\u7684\u6bcf\u4e2a\u5b57\u6bb5\u90fd\u6709\u4e00\u4e2a\u76f8\u5e94\u7684\u89e3\u6790\u5668\u51fd\u6570\uff0c\u5176\u8d23\u4efb\u662f\u8fd4\u56de\u6a21\u5f0f\u4e2d\u8be5\u5b57\u6bb5\u7684\u6570\u636e\u3002\u4f8b\u5982\uff0cQuery.feed()\u89e3\u6790\u5668\u5c06\u901a\u8fc7\u5bf9\u5e16\u5b50\u6570\u7ec4\u8fdb\u884c\u7b5b\u9009\u6765\u8fd4\u56de\u5df2\u53d1\u5e03\u7684\u5e16\u5b50\u3002<\/p>\n<p>\u89e3\u6790\u5668\u51fd\u6570\u63a5\u6536\u56db\u4e2a\u53c2\u6570\u3002<\/p>\n<ul class=\"post-ul\">\n<li><strong>parent\uff08\u7236\u7ea7\uff09<\/strong>\uff1a\u662f\u89e3\u6790\u5668\u94fe\u4e2d\u524d\u4e00\u4e2a\u89e3\u6790\u5668\u7684\u8fd4\u56de\u503c\u3002\u5bf9\u4e8e\u9876\u7ea7\u89e3\u6790\u5668\uff0cparent\u662f\u672a\u5b9a\u4e49\u7684\uff0c\u56e0\u4e3a\u6ca1\u6709\u8c03\u7528\u524d\u4e00\u4e2a\u89e3\u6790\u5668\u3002\u4f8b\u5982\uff0c\u5f53\u6267\u884cfeed\u67e5\u8be2\u65f6\uff0cquery.feed()\u89e3\u6790\u5668\u5c06\u88ab\u8c03\u7528\uff0cparent\u7684\u503c\u4e3aundefined\uff0c\u7136\u540ePost\u7684\u89e3\u6790\u5668\u5c06\u88ab\u8c03\u7528\uff0c\u5176\u4e2dparent\u662ffeed\u89e3\u6790\u5668\u8fd4\u56de\u7684\u5bf9\u8c61\u3002<\/li>\n<li><strong>args\uff08\u53c2\u6570\uff09<\/strong>\uff1a\u643a\u5e26\u67e5\u8be2\u7684\u53c2\u6570\u3002\u4f8b\u5982\uff0cpost\u67e5\u8be2\u5c06\u63a5\u6536\u8981\u83b7\u53d6\u7684\u5e16\u5b50\u7684id\u3002<\/li>\n<li><strong>context\uff08\u4e0a\u4e0b\u6587\uff09<\/strong>\uff1a\u662f\u4e00\u4e2a\u901a\u8fc7\u89e3\u6790\u5668\u94fe\u4f20\u9012\u7684\u5bf9\u8c61\uff0c\u6bcf\u4e2a\u89e3\u6790\u5668\u90fd\u53ef\u4ee5\u5199\u5165\u548c\u8bfb\u53d6\u8be5\u5bf9\u8c61\uff0c\u8fd9\u5141\u8bb8\u89e3\u6790\u5668\u4e4b\u95f4\u5171\u4eab\u4fe1\u606f\u3002<\/li>\n<li><strong>info\uff08\u4fe1\u606f\uff09<\/strong>\uff1a\u662f\u67e5\u8be2\u6216\u53d8\u66f4\u7684AST\uff08\u62bd\u8c61\u8bed\u6cd5\u6811\uff09\u8868\u793a\u3002\u4f60\u53ef\u4ee5\u5728Prisma\u5173\u4e8eGraphQL\u57fa\u7840\u7684\u7cfb\u5217\u6587\u7ae0\u4e2d\u9605\u8bfb\u66f4\u591a\u7ec6\u8282\u3002<\/li>\n<\/ul>\n<p>\u5728\u8fd9\u4e9b\u89e3\u6790\u5668\u4e2d\uff0c\u4e0d\u9700\u8981\u4e0a\u4e0b\u6587\u548c\u4fe1\u606f\uff0c\u53ea\u5b9a\u4e49\u4e86\u7236\u7ea7\u548c\u53c2\u6570\u3002<\/p>\n<p>\u5b8c\u6210\u540e\u4fdd\u5b58\u5e76\u9000\u51fa\u6587\u4ef6\u3002<\/p>\n<div class=\"post-conf-note\">\n<p class=\"post-conf-desc\">\u6ce8\u610f<\/p>\n<\/div>\n<div>\u6ce8\u610f\uff1a\u5f53\u4e00\u4e2a\u89e3\u6790\u5668\u8fd4\u56de\u4e0e\u89e3\u6790\u5668\u540d\u79f0\u76f8\u540c\u7684\u5b57\u6bb5\u65f6\uff0c\u4f8b\u5982Post\u7684\u56db\u4e2a\u89e3\u6790\u5668\uff0cApollo Server\u5c06\u81ea\u52a8\u89e3\u6790\u8fd9\u4e9b\u5b57\u6bb5\u3002\u8fd9\u610f\u5473\u7740\u60a8\u4e0d\u5fc5\u660e\u786e\u5b9a\u4e49\u8fd9\u4e9b\u89e3\u6790\u5668\u3002<br \/>\n&#8211; Post: {<br \/>\n&#8211; content: (parent) =&gt; parent.content,<br \/>\n&#8211; id: (parent) =&gt; parent.id,<br \/>\n&#8211; published: (parent) =&gt; parent.published,<br \/>\n&#8211; title: (parent) =&gt; parent.title,<br \/>\n&#8211; },<br \/>\n\u6ce8\u610f\uff1a\u5f53\u4e00\u4e2a\u89e3\u6790\u5668\u8fd4\u56de\u4e0e\u89e3\u6790\u5668\u7684\u540d\u79f0\u76f8\u540c\u7684\u5b57\u6bb5\u65f6\uff0c\u4f8b\u5982Post\u7684\u56db\u4e2a\u89e3\u6790\u5668\uff0cApollo Server\u4f1a\u81ea\u52a8\u89e3\u6790\u5b83\u4eec\u3002\u8fd9\u610f\u5473\u7740\u60a8\u4e0d\u9700\u8981\u660e\u786e\u5b9a\u4e49\u8fd9\u4e9b\u89e3\u6790\u5668\u3002\u4f60\u5bfc\u51fa\u67b6\u6784\u548c\u89e3\u6790\u5668\uff0c\u4ee5\u4fbf\u5728\u4e0b\u4e00\u6b65\u4e2d\u4f7f\u7528\u5b83\u4eec\u6765\u4f7f\u7528Apollo Server\u5b9e\u4f8b\u5316\u670d\u52a1\u5668\u3002<\/p>\n<h2>\u7b2c\u4e09\u6b65 &#8211; \u521b\u5efa GraphQL \u670d\u52a1\u5668\u5728\u8fd9\u4e00\u6b65\u4e2d\uff0c\u4f60\u5c06\u4f7f\u7528Apollo Server\u521b\u5efaGraphQL\u670d\u52a1\u5668\uff0c\u5e76\u5c06\u5176\u7ed1\u5b9a\u5230\u4e00\u4e2a\u7aef\u53e3\uff0c\u4ee5\u4fbf\u670d\u52a1\u5668\u53ef\u4ee5\u63a5\u53d7\u8fde\u63a5\u3002<\/p>\n<p>\u9996\u5148\uff0c\u8fd0\u884c\u4e0b\u5217\u547d\u4ee4\u521b\u5efa\u670d\u52a1\u5668\u7684\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> src\/server.js<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5c06\u4ee5\u4e0b\u4ee3\u7801\u6dfb\u52a0\u5230\u6587\u4ef6\u4e2d\u3002<\/p>\n<div>prisma-graphql\/src\/server.js\u7684\u539f\u6587\u5982\u4e0b\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token maybe-class-name\">ApolloServer<\/span> <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">require<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'apollo-server'<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> resolvers<span class=\"token punctuation\">,<\/span> typeDefs <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">require<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'.\/schema'<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> port <span class=\"token operator\">=<\/span> process<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">env<\/span><span class=\"token punctuation\">.<\/span><span class=\"token constant\">PORT<\/span> <span class=\"token operator\">||<\/span> <span class=\"token number\">8080<\/span>\r\n\r\n<span class=\"token keyword\">new<\/span> <span class=\"token class-name\">ApolloServer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> resolvers<span class=\"token punctuation\">,<\/span> typeDefs <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">listen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> port <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span>\r\n  <span class=\"token console class-name\">console<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">Server ready at: http:\/\/localhost:<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>port<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u8fd9\u91cc\uff0c\u60a8\u5b9e\u4f8b\u5316\u670d\u52a1\u5668\u5e76\u4ece\u4e4b\u524d\u7684\u6b65\u9aa4\u4f20\u9012\u6a21\u5f0f\u548c\u89e3\u6790\u5668\u3002<\/p>\n<p>\u670d\u52a1\u5668\u5c06\u8981\u7ed1\u5b9a\u7684\u7aef\u53e3\u662f\u6839\u636ePORT\u73af\u5883\u53d8\u91cf\u6765\u8bbe\u7f6e\u7684\u3002\u5982\u679c\u6ca1\u6709\u8bbe\u7f6e\uff0c\u9ed8\u8ba4\u7aef\u53e3\u5c06\u4e3a8080\u3002PORT\u73af\u5883\u53d8\u91cf\u5c06\u7531\u5e94\u7528\u5e73\u53f0\u81ea\u52a8\u8bbe\u7f6e\uff0c\u5e76\u786e\u4fdd\u5728\u90e8\u7f72\u540e\u60a8\u7684\u670d\u52a1\u5668\u53ef\u4ee5\u63a5\u53d7\u8fde\u63a5\u3002<\/p>\n<p>\u4fdd\u5b58\u5e76\u9000\u51fa\u6587\u4ef6\u3002<\/p>\n<p>\u60a8\u7684GraphQL API\u5df2\u51c6\u5907\u5c31\u7eea\u3002\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u542f\u52a8\u670d\u52a1\u5668\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">node<\/span> src\/server.js<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4f60\u5c06\u6536\u5230\u5982\u4e0b\u8f93\u51fa\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Server ready at: http:\/\/localhost:8080<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5728package.json\u6587\u4ef6\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u542f\u52a8\u811a\u672c\u88ab\u8ba4\u4e3a\u662f\u4e00\u4e2a\u5f88\u597d\u7684\u505a\u6cd5\uff0c\u8fd9\u6837\u53ef\u4ee5\u6e05\u695a\u5730\u6307\u5b9a\u670d\u52a1\u5668\u7684\u5165\u53e3\u70b9\u3002\u8fd9\u6837\u505a\u5c06\u5141\u8bb8\u5e94\u7528\u5e73\u53f0\u5728\u90e8\u7f72\u540e\u542f\u52a8\u670d\u52a1\u5668\u3002<\/p>\n<p>\u9996\u5148\uff0c\u901a\u8fc7\u6309\u4e0bCTRL+C\u6765\u505c\u6b62\u670d\u52a1\u5668\u3002\u7136\u540e\uff0c\u8981\u6dfb\u52a0\u542f\u52a8\u811a\u672c\uff0c\u8bf7\u6253\u5f00package.json\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> package.json<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5c06\u4ee5\u4e0b\u6587\u672c\u6dfb\u52a0\u5230package.json\u4e2d\u7684\u201cscripts\u201d\u5bf9\u8c61\u4e2d\uff1a<\/p>\n<div>package.json \u6587\u4ef6<\/p>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token property\">\"name\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"prisma-graphql\"<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token property\">\"version\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"1.0.0\"<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token property\">\"description\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"\"<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token property\">\"main\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"index.js\"<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token property\">\"scripts\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token property\">\"test\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"echo \\\"Error: no test specified\\\" &amp;&amp; exit 1\"<\/span><mark><span class=\"token punctuation\">,<\/span><\/mark>\r\n    <mark><span class=\"token property\">\"start\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"node .\/src\/server.js\"<\/span><\/mark>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token property\">\"keywords\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token property\">\"author\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"\"<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token property\">\"license\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"ISC\"<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token property\">\"dependencies\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token property\">\"apollo-server\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"^3.11.1\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token property\">\"graphql\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"^16.6.0\"<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4fdd\u5b58\u5e76\u9000\u51fa\u6587\u4ef6\u3002<\/p>\n<p>\u73b0\u5728\u4f60\u53ef\u4ee5\u7528\u4ee5\u4e0b\u547d\u4ee4\u542f\u52a8\u670d\u52a1\u5668\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">npm<\/span> start<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u60a8\u5c06\u6536\u5230\u4ee5\u4e0b\u8f93\u51fa\uff1a<\/p>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/p>\n<pre class=\"post-pre\"><code>&gt; prisma-graphql@1.0.0 start &gt; node .\/src\/server.js \r\n\u670d\u52a1\u5668\u5c31\u7eea\u4e8e\uff1ahttp:\/\/localhost:8080<\/code><\/pre>\n<\/div>\n<p>\u6d4b\u8bd5GraphQL API\uff0c\u6253\u5f00\u8f93\u51fa\u7684URL\uff0c\u5c06\u5e26\u60a8\u8fdb\u5165Apollo GraphQL Studio\u3002\u5728\u4e3b\u9875\u4e0a\u70b9\u51fb&#8221;\u67e5\u8be2\u60a8\u7684\u670d\u52a1\u5668&#8221;\u6309\u94ae\u4e0eIDE\u8fdb\u884c\u4ea4\u4e92\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/83-0.png\" alt=\"Apollo GraphQL Studio\" \/><\/div>\n<p>Apollo GraphQL Studio\u662f\u4e00\u4e2a\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u5728\u5176\u4e2d\u53ef\u4ee5\u901a\u8fc7\u53d1\u9001\u67e5\u8be2\u548c\u53d8\u5f02\u6765\u6d4b\u8bd5API\u3002<\/p>\n<p>\u4f8b\u5982\uff0c\u8981\u6d4b\u8bd5\u53ea\u8fd4\u56de\u5df2\u53d1\u5e03\u5e16\u5b50\u7684\u8ba2\u9605\u67e5\u8be2\uff0c\u5728IDE\u7684\u5de6\u4fa7\u8f93\u5165\u4ee5\u4e0b\u67e5\u8be2\uff0c\u5e76\u901a\u8fc7\u6309\u4e0b\u8fd0\u884c\u6216\u64ad\u653e\u6309\u94ae\u53d1\u9001\u67e5\u8be2\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">query<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token object\">feed<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token property\">id<\/span>\r\n    <span class=\"token property\">title<\/span>\r\n    <span class=\"token property\">content<\/span>\r\n    <span class=\"token property\">published<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u56de\u5e94\u5c06\u663e\u793a\u6807\u9898\u4e3a&#8221;\u8ba2\u9605GraphQL\u5468\u520a&#8221;\u7684URL\uff0c\u5e76\u5728Twitter\u4e0a\u5173\u6ce8Silicon Cloud\u9644\u4e0a\u5176URL\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/88-0.png\" alt=\"GraphQL Feed Query\" \/><\/div>\n<p>\u70b9\u51fb\u4e0a\u65b9\u5de5\u5177\u680f\u4e0a\u7684&#8221;+&#8221;\u6309\u94ae\uff0c\u521b\u5efa\u65b0\u7684\u6807\u7b7e\u9875\u3002\u7136\u540e\uff0c\u4e3a\u4e86\u6d4b\u8bd5 createDraft \u53d8\u5f02\uff0c\u8f93\u5165\u4ee5\u4e0b\u53d8\u5f02\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">mutation<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token property-query property-mutation\">createDraft<\/span><span class=\"token punctuation\">(<\/span><span class=\"token attr-name\">title<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"\u5c06GraphQL API\u90e8\u7f72\u5230Silicon Cloud\"<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token property\">id<\/span>\r\n    <span class=\"token property\">title<\/span>\r\n    <span class=\"token property\">content<\/span>\r\n    <span class=\"token property\">published<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u4f60\u4f7f\u7528\u64ad\u653e\u6309\u94ae\u63d0\u4ea4\u53d8\u66f4\u540e\uff0c\u4f60\u5c06\u4f1a\u5728\u54cd\u5e94\u4e2d\u7684\u6807\u9898\u5b57\u6bb5\u4e2d\u6536\u5230\u4e00\u4e2a\u6807\u9898\u4e3a&#8221;\u5c06GraphQL API\u90e8\u7f72\u5230Silicon Cloud&#8221;\u7684\u54cd\u5e94\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/92-0.png\" alt=\"GraphQL Create Draft Mutation\" \/><\/div>\n<div class=\"post-conf-note\">\n<p class=\"post-conf-desc\">\u6ce8\u610f\uff1a<\/p>\n<p>\u8bf7\u6ce8\u610f\uff1a\u4f60\u53ef\u4ee5\u901a\u8fc7\u5728 createDraft \u540e\u9762\u7684\u82b1\u62ec\u53f7 ({}) \u4e2d\u6dfb\u52a0\u6216\u5220\u9664\u5b57\u6bb5\u6765\u9009\u62e9\u8fd4\u56de\u7684\u5b57\u6bb5\u3002\u4f8b\u5982\uff0c\u5982\u679c\u4f60\u53ea\u60f3\u8fd4\u56de id \u548c title\uff0c\u4f60\u53ef\u4ee5\u53d1\u9001\u5982\u4e0b\u7684 mutation\uff1a<\/p>\n<pre class=\"post-pre\"><code>mutation {\r\n  createDraft(title: \"\u5c06 GraphQL API \u90e8\u7f72\u5230 Silicon Cloud\") {\r\n    id\r\n    title\r\n  }\r\n}<\/code><\/pre>\n<p>\u60a8\u5df2\u6210\u529f\u521b\u5efa\u5e76\u6d4b\u8bd5\u4e86GraphQL\u670d\u52a1\u5668\u3002\u63a5\u4e0b\u6765\u7684\u6b65\u9aa4\u662f\u4e3a\u8be5\u9879\u76ee\u521b\u5efa\u4e00\u4e2aGitHub\u5b58\u50a8\u5e93\u3002<\/p>\n<\/div>\n<h2>\u7b2c\u56db\u6b65 \u2014 \u521b\u5efaGitHub\u4ed3\u5e93<\/h2>\n<p>\u5728\u8fd9\u4e00\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u4e3a\u60a8\u7684\u9879\u76ee\u521b\u5efa\u4e00\u4e2aGitHub\u5b58\u50a8\u5e93\uff0c\u5e76\u63a8\u9001\u60a8\u7684\u66f4\u6539\uff0c\u4ee5\u4fbf\u53ef\u4ee5\u4eceGitHub\u81ea\u52a8\u90e8\u7f72GraphQL API\u5230\u5e94\u7528\u5e73\u53f0\u3002<\/p>\n<p>\u9996\u5148\uff0c\u901a\u8fc7\u6309\u4e0bCTRL+C\u505c\u6b62\u5f00\u53d1\u670d\u52a1\u5668\u3002\u7136\u540e\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5728prisma-graphql\u6587\u4ef6\u5939\u4e2d\u521d\u59cb\u5316\u4e00\u4e2a\u5b58\u50a8\u5e93\u3002<\/p>\n<pre class=\"post-pre\"><code>$ git init<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528\u4ee5\u4e0b\u4e24\u6761\u547d\u4ee4\u5c06\u4ee3\u7801\u63d0\u4ea4\u5230\u4ee3\u7801\u5e93\u4e2d\uff1a<\/p>\n<pre class=\"post-pre\"><code>$ git add src package-lock.json package.json\r\n$ git commit -m 'Initial commit'<\/code><\/pre>\n<p>\u65e2\u7136\u60a8\u5df2\u7ecf\u5c06\u66f4\u6539\u63d0\u4ea4\u5230\u672c\u5730\u4ed3\u5e93\uff0c\u60a8\u5c06\u5728GitHub\u4e0a\u521b\u5efa\u4e00\u4e2a\u4ed3\u5e93\u5e76\u5c06\u66f4\u6539\u63a8\u9001\u3002<\/p>\n<p>\u524d\u5f80 GitHub \u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u5b58\u50a8\u5e93\u3002\u4e3a\u4fdd\u6301\u4e00\u81f4\uff0c\u5c06\u5b58\u50a8\u5e93\u547d\u540d\u4e3a prisma-graphql\uff0c\u7136\u540e\u70b9\u51fb\u521b\u5efa\u5b58\u50a8\u5e93\u3002<\/p>\n<p>\u521b\u5efa\u4ed3\u5e93\u540e\uff0c\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u63a8\u9001\u66f4\u6539\uff0c\u5176\u4e2d\u5305\u62ec\u5c06\u9ed8\u8ba4\u7684\u672c\u5730\u5206\u652f\u91cd\u547d\u540d\u4e3amain\uff1a<\/p>\n<pre class=\"post-pre\"><code>$ git remote add origin git@github.com:<mark>your_github_username<\/mark>\/prisma-graphql.git\r\n$ git branch -M main\r\n$ git push --set-upstream origin main<\/code><\/pre>\n<p>\u4f60\u5df2\u6210\u529f\u5b8c\u6210\u5e76\u63a8\u9001\u4e86\u53d8\u66f4\u5230GitHub\u3002\u63a5\u4e0b\u6765\uff0c\u4f60\u5c06\u8fde\u63a5\u5b58\u50a8\u5e93\u5230App Platform\u5e76\u90e8\u7f72GraphQL API\u3002<\/p>\n<h2>\u6b65\u9aa45 &#8211; \u90e8\u7f72\u5230\u5e94\u7528\u5e73\u53f0<\/h2>\n<p>\u5728\u8fd9\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u628a\u60a8\u521a\u521a\u521b\u5efa\u7684 GitHub \u5b58\u50a8\u5e93\u4e0e Silicon Cloud \u8fdb\u884c\u8fde\u63a5\uff0c\u5e76\u914d\u7f6e\u5e94\u7528\u5e73\u53f0\uff0c\u4ee5\u4fbf\u5728\u60a8\u5c06\u66f4\u6539\u63a8\u9001\u5230 GitHub \u65f6\uff0cGraphQL API \u53ef\u4ee5\u81ea\u52a8\u90e8\u7f72\u3002<\/p>\n<p>\u9996\u5148\uff0c\u5728Silicon Cloud\u4e91\u63a7\u5236\u53f0\u4e2d\u8bbf\u95ee&#8221;\u5e94\u7528\u5e73\u53f0&#8221;\u9875\u9762\uff0c\u7136\u540e\u70b9\u51fb&#8221;\u521b\u5efa\u5e94\u7528&#8221;\u6309\u94ae\u3002<\/p>\n<p>\u60a8\u5c06\u4f1a\u770b\u5230\u4ee5GitHub\u4f5c\u4e3a\u9ed8\u8ba4\u9009\u9879\u7684\u670d\u52a1\u63d0\u4f9b\u5546\u9009\u9879\u3002<\/p>\n<p>\u5982\u679c\u60a8\u8fd8\u6ca1\u6709\u5c06Silicon Cloud\u914d\u7f6e\u5230\u60a8\u7684GitHub\u5e10\u6237\u4e2d\uff0c\u8bf7\u70b9\u51fb&#8221;\u7ba1\u7406\u8bbf\u95ee\u6743\u9650&#8221;\u6309\u94ae\uff0c\u5c06\u4f1a\u88ab\u91cd\u5b9a\u5411\u5230GitHub\u7f51\u7ad9\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"Silicon Cloud\u63a7\u5236\u53f0\u9875\u9762\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/111-0.png\" alt=\"Silicon Cloud\u63a7\u5236\u53f0\u9875\u9762\" \/><\/div>\n<p>\u60a8\u53ef\u4ee5\u9009\u62e9\u6240\u6709\u5b58\u50a8\u5e93\u6216\u7279\u5b9a\u7684\u5b58\u50a8\u5e93\u3002\u70b9\u51fb\u300c\u5b89\u88c5\u548c\u6388\u6743\u300d\uff0c\u7136\u540e\u60a8\u5c06\u88ab\u91cd\u5b9a\u5411\u56de Silicon Cloud \u5e94\u7528\u5e73\u53f0\u521b\u5efa\u754c\u9762\u3002<\/p>\n<p>\u9009\u62e9\u60a8\u7684Github\u7528\u6237\u540d\/prisma-graphql\u4ed3\u5e93\uff0c\u7136\u540e\u70b9\u51fb\u4e0b\u4e00\u6b65\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u9009\u62e9\u81ea\u52a8\u90e8\u7f72\uff0c\u60a8\u53ef\u4ee5\u4fdd\u6301\u9009\u62e9\u4ee5\u786e\u4fdd\u91cd\u65b0\u90e8\u7f72\u7684\u4e00\u81f4\u6027\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\u9009\u62e9\u5b58\u50a8\u5e93\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/114-0.png\" alt=\"\u9009\u62e9\u5b58\u50a8\u5e93\" \/><\/div>\n<p>\u5728&#8221;\u8d44\u6e90&#8221;\u9875\u9762\u4e0a\uff0c\u70b9\u51fb&#8221;\u7f16\u8f91\u8ba1\u5212&#8221;\u6309\u94ae\u6765\u9009\u62e9\u4e00\u4e2a\u5408\u9002\u7684\u8ba1\u5212\u3002\u9009\u62e9\u6240\u9700\u7684\u57fa\u7840\u8ba1\u5212\u53ca\u5176\u5927\u5c0f\uff08\u672c\u6559\u7a0b\u5c06\u4f7f\u7528\u6bcf\u67085.00\u7f8e\u5143\u7684\u57fa\u7840\u8ba1\u5212\uff09\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\u9009\u62e9\u8ba1\u5212\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/116-0.png\" alt=\"\u9009\u62e9\u8ba1\u5212\" \/><\/div>\n<p>\u70b9\u51fb\u8fd4\u56de\u6309\u94ae\u8fd4\u56de\u521b\u5efa\u9875\u9762\u3002<\/p>\n<p>\u5982\u679c\u60a8\u70b9\u51fb\u9879\u76ee\u540d\u79f0\u65c1\u8fb9\u7684\u7b14\u56fe\u6807\uff0c\u60a8\u53ef\u4ee5\u81ea\u5b9a\u4e49\u5e94\u7528\u7a0b\u5e8f\u7684\u914d\u7f6e\u3002\u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e\u9875\u9762\u5c06\u4f1a\u6253\u5f00\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/119-0.png\" alt=\"\u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e\" \/><\/div>\n<p>\u786e\u4fdd&#8221;\u8fd0\u884c\u547d\u4ee4&#8221;\u8bbe\u7f6e\u4e3anpm start\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u5e94\u7528\u5e73\u53f0\u5c06HTTP\u7aef\u53e3\u8bbe\u7f6e\u4e3a8080\uff0c\u8fd9\u4e0e\u60a8\u914d\u7f6e\u7684GraphQL\u670d\u52a1\u5668\u7ed1\u5b9a\u7684\u7aef\u53e3\u76f8\u540c\u3002<\/p>\n<p>\u5f53\u60a8\u5b8c\u6210\u81ea\u5b9a\u4e49\u914d\u7f6e\u540e\uff0c\u6309\u4e0b\u8fd4\u56de\u6309\u94ae\u8fd4\u56de\u5230\u8bbe\u7f6e\u9875\u9762\u3002\u7136\u540e\uff0c\u6309\u4e0b\u4e0b\u4e00\u6b65\u6309\u94ae\u8fdb\u5165\u73af\u5883\u53d8\u91cf\u9875\u9762\u3002<\/p>\n<p>\u60a8\u7684\u73af\u5883\u53d8\u91cf\u6682\u65f6\u4e0d\u9700\u8981\u8fdb\u884c\u8fdb\u4e00\u6b65\u914d\u7f6e\u3002\u8bf7\u70b9\u51fb\u4e0b\u4e00\u6b65\u6309\u94ae\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\u73af\u5883\u53d8\u91cf\u8bbe\u7f6e\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/123-0.png\" alt=\"\u73af\u5883\u53d8\u91cf\u8bbe\u7f6e\" \/><\/div>\n<p>\u5728\u4fe1\u606f\u9875\u9762\u4e0a\uff0c\u60a8\u53ef\u4ee5\u8c03\u6574\u5e94\u7528\u7a0b\u5e8f\u7684\u8be6\u7ec6\u4fe1\u606f\u548c\u4f4d\u7f6e\u3002\u7f16\u8f91\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u4fe1\u606f\uff0c\u9009\u62e9\u60a8\u60f3\u8981\u90e8\u7f72\u5e94\u7528\u7a0b\u5e8f\u7684\u5730\u533a\u3002\u901a\u8fc7\u6309\u4e0b\u4fdd\u5b58\u6309\u94ae\u786e\u8ba4\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u8be6\u7ec6\u4fe1\u606f\u3002\u7136\u540e\uff0c\u70b9\u51fb\u4e0b\u4e00\u6b65\u6309\u94ae\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\u4fe1\u606f\u9875\u9762\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/125-0.png\" alt=\"\u4fe1\u606f\u9875\u9762\" \/><\/div>\n<p>\u60a8\u5c06\u80fd\u591f\u5728&#8221;\u56de\u987e&#8221;\u9875\u9762\u4e0a\u67e5\u770b\u60a8\u9009\u62e9\u7684\u6240\u6709\u9009\u9879\u3002\u7136\u540e\u70b9\u51fb&#8221;\u521b\u5efa\u8d44\u6e90&#8221;\u3002\u60a8\u5c06\u88ab\u91cd\u5b9a\u5411\u5230\u5e94\u7528\u9875\u9762\uff0c\u5728\u90a3\u91cc\u60a8\u5c06\u770b\u5230\u521d\u59cb\u90e8\u7f72\u7684\u8fdb\u5c55\u60c5\u51b5\u3002<\/p>\n<p>\u4e00\u65e6\u6784\u5efa\u5b8c\u6210\uff0c\u60a8\u5c06\u6536\u5230\u4e00\u6761\u901a\u77e5\uff0c\u63d0\u793a\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u5df2\u7ecf\u90e8\u7f72\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\u90e8\u7f72\u8fdb\u5ea6\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/128-0.png\" alt=\"\u90e8\u7f72\u8fdb\u5ea6\" \/><\/div>\n<p>\u60a8\u73b0\u5728\u53ef\u4ee5\u8bbf\u95ee\u5728\u60a8\u7684Silicon Cloud\u63a7\u5236\u53f0\u4e2d\u5e94\u7528\u540d\u79f0\u4e0b\u65b9URL\u4e2d\u90e8\u7f72\u7684GraphQL API\u3002\u5b83\u5c06\u901a\u8fc7&#8221;ondigitalocean.app&#8221;\u5b50\u57df\u540d\u8fdb\u884c\u94fe\u63a5\u3002\u5f53\u60a8\u6253\u5f00\u8be5URL\u65f6\uff0cGraphQL Playground\u5c06\u4f1a\u4ee5\u4e0e\u672c\u6559\u7a0b\u7b2c3\u6b65\u76f8\u540c\u7684\u65b9\u5f0f\u6253\u5f00\u3002<\/p>\n<p>\u60a8\u5df2\u6210\u529f\u5c06\u60a8\u7684\u4ed3\u5e93\u8fde\u63a5\u5230App\u5e73\u53f0\u5e76\u90e8\u7f72\u4e86\u60a8\u7684GraphQL API\u3002\u63a5\u4e0b\u6765\uff0c\u60a8\u5c06\u5347\u7ea7\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u5e76\u7528\u6570\u636e\u5e93\u66ff\u6362GraphQL API\u7684\u5185\u5b58\u6570\u636e\u3002<\/p>\n<h2>\u6b65\u9aa46 \u2014 \u4f7f\u7528PostgreSQL\u8bbe\u7f6ePrisma<\/h2>\n<p>\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u60a8\u5df2\u7ecf\u4f7f\u7528\u5185\u5b58\u4e2d\u7684\u5e16\u5b50\u6570\u7ec4\u6784\u5efa\u4e86\u4e00\u4e2aGraphQL API\u6765\u5b58\u50a8\u6570\u636e\u3002\u5982\u679c\u60a8\u7684\u670d\u52a1\u5668\u91cd\u65b0\u542f\u52a8\uff0c\u6240\u6709\u5bf9\u6570\u636e\u7684\u66f4\u6539\u90fd\u5c06\u4e22\u5931\u3002\u4e3a\u4e86\u786e\u4fdd\u6570\u636e\u5b89\u5168\u6301\u4e45\u5316\uff0c\u60a8\u5c06\u4f7f\u7528PostgreSQL\u6570\u636e\u5e93\u66ff\u6362\u5e16\u5b50\u6570\u7ec4\uff0c\u5e76\u4f7f\u7528Prisma\u8bbf\u95ee\u6570\u636e\u3002<\/p>\n<p>\u5728\u8fd9\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u5b89\u88c5 Prisma CLI\uff0c\u521b\u5efa\u521d\u59cb\u7684 Prisma schema\uff08Prisma \u8bbe\u7f6e\u7684\u4e3b\u8981\u914d\u7f6e\u6587\u4ef6\uff0c\u5305\u542b\u6570\u636e\u5e93 schema\uff09\uff0c\u4f7f\u7528 Docker \u5728\u672c\u5730\u8bbe\u7f6e PostgreSQL\uff0c\u5e76\u5c06 Prisma \u4e0e\u5176\u8fde\u63a5\u8d77\u6765\u3002<\/p>\n<p>\u4ece\u4e0b\u9762\u7684\u547d\u4ee4\u5f00\u59cb\u5b89\u88c5Prisma CLI\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol>\r\n  <li data-prefix=\"$\"><span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> --save-dev prisma<\/li>\r\n<\/ol><\/code><\/pre>\n<p>Prisma\u547d\u4ee4\u884c\u754c\u9762\u5c06\u52a9\u529b\u4e8e\u6570\u636e\u5e93\u5de5\u4f5c\u6d41\u7a0b\uff0c\u5982\u8fd0\u884c\u6570\u636e\u5e93\u8fc1\u79fb\u548c\u751f\u6210Prisma Client\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u60a8\u5c06\u4f7f\u7528Docker\u8bbe\u7f6e\u60a8\u7684PostgreSQL\u6570\u636e\u5e93\u3002\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Docker Compose\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol>\r\n  <li data-prefix=\"$\"><span class=\"token function\">nano<\/span> docker-compose.yml<\/li>\r\n<\/ol><\/code><\/pre>\n<p>\u5c06\u4ee5\u4e0b\u4ee3\u7801\u6dfb\u52a0\u5230\u65b0\u521b\u5efa\u7684\u6587\u4ef6\u4e2d\u3002<\/p>\n<p>\u8bf7\u5c06\u4ee5\u4e0b\u5185\u5bb9\u4ee5\u4e2d\u56fd\u672c\u5730\u65b9\u5f0f\u8fdb\u884c\u91ca\u4e49\uff0c\u53ea\u9700\u8981\u4e00\u79cd\u9009\u9879\uff1aprisma-graphql\/docker-compose.yml<\/p>\n<p>\u666e\u5229\u5179\u739b\uff08Prisma\uff09-GraphQL\/docker-compose.yml<\/p>\n<pre class=\"post-pre\"><code><span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'3.8'<\/span>\r\n<span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">postgres<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> postgres<span class=\"token punctuation\">:<\/span><span class=\"token number\">14<\/span>\r\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> always\r\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> POSTGRES_USER=<mark>test<span class=\"token punctuation\">-<\/span>user<\/mark>\r\n      <span class=\"token punctuation\">-<\/span> POSTGRES_PASSWORD=<mark>test<span class=\"token punctuation\">-<\/span>password<\/mark>\r\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> postgres<span class=\"token punctuation\">:<\/span>\/var\/lib\/postgresql\/data\r\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token punctuation\">-<\/span> <span class=\"token string\">'5432:5432'<\/span>\r\n<span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">postgres<\/span><span class=\"token punctuation\">:<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u4e2aDocker Compose\u914d\u7f6e\u6587\u4ef6\u8d1f\u8d23\u5728\u4f60\u7684\u7535\u8111\u4e0a\u542f\u52a8\u5b98\u65b9\u7684PostgreSQL Docker\u955c\u50cf\u3002POSTGRES_USER\u548cPOSTGRES_PASSWORD\u73af\u5883\u53d8\u91cf\u8bbe\u7f6e\u4e86\u8d85\u7ea7\u7528\u6237\uff08\u62e5\u6709\u7ba1\u7406\u5458\u6743\u9650\uff09\u7684\u51ed\u636e\u3002\u4f60\u5c06\u4f7f\u7528\u8fd9\u4e9b\u51ed\u636e\u8fde\u63a5Prisma\u5230\u6570\u636e\u5e93\u3002\u7528\u4f60\u7684\u7528\u6237\u51ed\u636e\u66ff\u6362test-user\u548ctest-password\u3002<\/p>\n<p>\u6700\u540e\uff0c\u60a8\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5b58\u50a8 PostgreSQL \u6570\u636e\u7684\u5377\uff0c\u5e76\u5c06\u60a8\u673a\u5668\u4e0a\u7684 5432 \u7aef\u53e3\u7ed1\u5b9a\u5230 Docker \u5bb9\u5668\u4e2d\u7684\u540c\u4e00\u7aef\u53e3\u3002<\/p>\n<p>\u4fdd\u5b58\u5e76\u9000\u51fa\u6587\u4ef6\u3002<\/p>\n<p>\u6709\u4e86\u8fd9\u4e2a\u8bbe\u7f6e\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u542f\u52a8PostgreSQL\u6570\u636e\u5e93\u670d\u52a1\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code><ol>\r\n  <li data-prefix=\"$\"><span class=\"token function\">docker-compose<\/span> up <span class=\"token parameter variable\">-d<\/span><\/li>\r\n<\/ol><\/code><\/pre>\n<p>\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\u6765\u52a0\u8f7d\u3002<\/p>\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u9a8c\u8bc1\u6570\u636e\u5e93\u670d\u52a1\u5668\u662f\u5426\u6b63\u5728\u8fd0\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code><ol>\r\n  <li data-prefix=\"$\"><span class=\"token function\">docker<\/span> <span class=\"token function\">ps<\/span><\/li>\r\n<\/ol><\/code><\/pre>\n<p>\u8fd9\u4e2a\u6307\u4ee4\u5c06\u4f1a\u8f93\u51fa\u7c7b\u4f3c\u4e8e\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/div>\n<pre class=\"post-pre\"><code>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 198f9431bf73 postgres:10.3 \"docker-entrypoint.s\u2026\" 45 seconds ago Up 11 seconds 0.0.0.0:5432->5432\/tcp prisma-graphql_postgres_1<\/code><\/pre>\n<p>\u5728\u8fd0\u884cPostgreSQL\u5bb9\u5668\u540e\uff0c\u60a8\u73b0\u5728\u53ef\u4ee5\u521b\u5efa\u60a8\u7684Prisma\u8bbe\u7f6e\u3002\u4ecePrisma CLI\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code><ol>\r\n  <li data-prefix=\"$\">npx prisma init<\/li>\r\n<\/ol><\/code><\/pre>\n<p>\u4f5c\u4e3a\u6700\u4f73\u5b9e\u8df5\uff0c\u4e3a\u4e86\u786e\u4fdd\u4f7f\u7528\u672c\u5730\u5b89\u88c5\uff0c\u6240\u6709 Prisma CLI \u7684\u8c03\u7528\u90fd\u5e94\u8be5\u4ee5 npx \u4e3a\u524d\u7f00\u3002<\/p>\n<p>\u8fd9\u6837\u7684\u8f93\u51fa\u5c06\u6253\u5370\u51fa\u6765\uff1a<\/p>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u2714 \u60a8\u7684Prisma schema\u5df2\u5728prisma\/schema.prisma\u521b\u5efa\u5b8c\u6210\u3002\u60a8\u73b0\u5728\u53ef\u4ee5\u5728\u60a8\u559c\u6b22\u7684\u7f16\u8f91\u5668\u4e2d\u6253\u5f00\u5b83\u3002\u540e\u7eed\u6b65\u9aa4\uff1a<br \/>\n1. \u5728.env\u6587\u4ef6\u4e2d\u8bbe\u7f6eDATABASE_URL\uff0c\u6307\u5411\u60a8\u73b0\u6709\u7684\u6570\u636e\u5e93\u3002\u5982\u679c\u60a8\u7684\u6570\u636e\u5e93\u8fd8\u6ca1\u6709\u8868\uff0c\u8bf7\u9605\u8bfbhttps:\/\/pris.ly\/d\/getting-started<br \/>\n2. \u5728schema.prisma\u4e2d\u8bbe\u7f6e\u6570\u636e\u6e90\u5757\u7684\u63d0\u4f9b\u8005\u4ee5\u5339\u914d\u60a8\u7684\u6570\u636e\u5e93\uff1apostgresql\u3001mysql\u3001sqlite\u3001sqlserver\u3001mongodb\u6216cockroachdb\u3002<br \/>\n3. \u8fd0\u884cprisma db pull\u5c06\u60a8\u7684\u6570\u636e\u5e93schema\u8f6c\u6362\u4e3aPrisma schema\u3002<br \/>\n4. \u8fd0\u884cprisma generate\u751f\u6210Prisma Client\u3002\u7136\u540e\u60a8\u53ef\u4ee5\u5f00\u59cb\u67e5\u8be2\u60a8\u7684\u6570\u636e\u5e93\u3002<br \/>\n\u66f4\u591a\u4fe1\u606f\u8bf7\u53c2\u9605\u6211\u4eec\u7684\u6587\u6863\uff1ahttps:\/\/pris.ly\/d\/getting-started<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u8fd0\u884c\u8be5\u547d\u4ee4\u540e\uff0cPrisma CLI\u4f1a\u5728\u9879\u76ee\u6587\u4ef6\u5939\u4e2d\u751f\u6210\u4e00\u4e2a\u79f0\u4e3a.env\u7684dotenv\u6587\u4ef6\uff0c\u7528\u4e8e\u5b9a\u4e49\u6570\u636e\u5e93\u8fde\u63a5URL\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u540d\u4e3aprisma\u7684\u65b0\u5d4c\u5957\u6587\u4ef6\u5939\uff0c\u5176\u4e2d\u5305\u542bschema.prisma\u6587\u4ef6\u3002\u8fd9\u662f\u60a8Prisma\u9879\u76ee\u7684\u4e3b\u8981\u914d\u7f6e\u6587\u4ef6\uff08\u60a8\u5c06\u5728\u5176\u4e2d\u5305\u542b\u6570\u636e\u6a21\u578b\uff09\u3002<\/p>\n<p>\u4e3a\u4e86\u786e\u4fddPrisma\u77e5\u9053\u4f60\u7684\u6570\u636e\u5e93\u4f4d\u7f6e\uff0c\u8bf7\u6253\u5f00.env\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> .env<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4f7f\u7528\u60a8\u7684\u7528\u6237\u51ed\u636e\u8c03\u6574DATABASE_URL\u73af\u5883\u53d8\u91cf\u3002<\/p>\n<div>prisma-graphql\/.env \u6587\u4ef6\u4f4d\u4e8e prisma-graphql \u76ee\u5f55\u4e0b<\/p>\n<pre class=\"post-pre\"><code>DATABASE_URL=\"postgresql:\/\/<mark>test-user<\/mark>:<mark>test-password<\/mark>@localhost:5432\/<mark>my-blog<\/mark>?schema=public\"\r\n<\/code><\/pre>\n<\/div>\n<p>\u60a8\u4f7f\u7528\u4e86\u5728Docker Compose\u6587\u4ef6\u4e2d\u6307\u5b9a\u7684\u6570\u636e\u5e93\u51ed\u636etest-user\u548ctest-password\u3002\u5982\u679c\u60a8\u5728Docker Compose\u6587\u4ef6\u4e2d\u4fee\u6539\u4e86\u51ed\u636e\uff0c\u8bf7\u786e\u4fdd\u66f4\u65b0\u6b64\u884c\u4ee5\u4e0e\u90a3\u4e2a\u6587\u4ef6\u4e2d\u7684\u51ed\u636e\u5339\u914d\u3002\u8981\u4e86\u89e3\u6709\u5173\u8fde\u63a5URL\u683c\u5f0f\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u8bbf\u95eePrisma\u6587\u6863\u3002<\/p>\n<p>\u60a8\u5df2\u7ecf\u6210\u529f\u542f\u52a8\u4e86PostgreSQL\uff0c\u5e76\u4f7f\u7528Prisma schema\u5bf9\u5176\u8fdb\u884c\u4e86\u914d\u7f6e\u3002\u63a5\u4e0b\u6765\u7684\u6b65\u9aa4\u662f\uff0c\u60a8\u5c06\u4e3a\u535a\u5ba2\u5b9a\u4e49\u6570\u636e\u6a21\u578b\uff0c\u5e76\u4f7f\u7528Prisma Migrate\u6765\u521b\u5efa\u6570\u636e\u5e93\u67b6\u6784\u3002<\/p>\n<h2>\u7b2c\u4e03\u6b65 &#8211; \u4f7f\u7528Prisma Migrate\u5b9a\u4e49\u6570\u636e\u6a21\u578b<\/h2>\n<p>\u73b0\u5728\u60a8\u5c06\u5728\u521a\u521a\u521b\u5efa\u7684Prisma schema\u6587\u4ef6\u4e2d\u5b9a\u4e49\u60a8\u7684\u6570\u636e\u6a21\u578b\u3002\u7136\u540e\uff0c\u8fd9\u4e2a\u6570\u636e\u6a21\u578b\u5c06\u901a\u8fc7Prisma Migrate\u6620\u5c04\u5230\u6570\u636e\u5e93\uff0c\u5e76\u751f\u6210\u548c\u53d1\u9001SQL\u8bed\u53e5\u4ee5\u521b\u5efa\u4e0e\u60a8\u7684\u6570\u636e\u6a21\u578b\u76f8\u5bf9\u5e94\u7684\u8868\u3002<\/p>\n<p>\u7531\u4e8e\u60a8\u6b63\u5728\u6784\u5efa\u4e00\u4e2a\u535a\u5ba2\uff0c\u5e94\u7528\u7a0b\u5e8f\u7684\u4e3b\u8981\u5b9e\u4f53\u5c06\u662f\u7528\u6237\u548c\u5e16\u5b50\u3002\u5728\u8fd9\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u5b9a\u4e49\u4e00\u4e2a\u5e16\u5b50\u6a21\u578b\uff0c\u5176\u7ed3\u6784\u4e0eGraphQL schema\u4e2d\u7684\u5e16\u5b50\u7c7b\u578b\u7c7b\u4f3c\u3002\u5728\u7a0d\u540e\u7684\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u6539\u8fdb\u5e94\u7528\u7a0b\u5e8f\u5e76\u6dfb\u52a0\u4e00\u4e2a\u7528\u6237\u6a21\u578b\u3002<\/p>\n<div class=\"post-conf-note\">\n<p class=\"post-conf-desc\">\u6ce8\u610f\uff1a<\/p>\n<p>GraphQL API\u53ef\u4ee5\u88ab\u89c6\u4e3a\u6570\u636e\u5e93\u7684\u62bd\u8c61\u5c42\u3002\u6784\u5efaGraphQL API\u65f6\uff0cGraphQL schema\u901a\u5e38\u4f1a\u4e0e\u6570\u636e\u5e93schema\u7d27\u5bc6\u76f8\u4f3c\u3002\u7136\u800c\uff0c\u4f5c\u4e3a\u4e00\u79cd\u62bd\u8c61\uff0c\u8fd9\u4e24\u4e2aschema\u4e0d\u4e00\u5b9a\u5177\u6709\u76f8\u540c\u7684\u7ed3\u6784\uff0c\u56e0\u6b64\u5141\u8bb8\u60a8\u63a7\u5236\u8981\u5728API\u4e0a\u516c\u5f00\u54ea\u4e9b\u6570\u636e\uff0c\u56e0\u4e3a\u67d0\u4e9b\u6570\u636e\u53ef\u80fd\u88ab\u89c6\u4e3a\u654f\u611f\u6216\u4e0eAPI\u5c42\u65e0\u5173\u3002Prisma\u5229\u7528\u81ea\u8eab\u7684\u6570\u636e\u5efa\u6a21\u8bed\u8a00\u6765\u5b9a\u4e49\u5e94\u7528\u6570\u636e\u7684\u7ed3\u6784\u3002<\/p>\n<\/div>\n<p>\u4ece\u9879\u76ee\u7684\u6587\u4ef6\u5939\u4e2d\u6253\u5f00\u4f4d\u4e8e package.json \u6240\u5728\u4f4d\u7f6e\u7684 schema.prisma \u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> prisma\/schema.prisma<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"post-conf-note\">\n<p class=\"post-conf-desc\">\u6ce8\u610f\uff1a<\/p>\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528pwd\u547d\u4ee4\u4ece\u7ec8\u7aef\u9a8c\u8bc1\u6240\u5728\u6587\u4ef6\u5939\uff0c\u8be5\u547d\u4ee4\u5c06\u8f93\u51fa\u5f53\u524d\u5de5\u4f5c\u76ee\u5f55\u3002\u6b64\u5916\uff0c\u4f7f\u7528ls\u547d\u4ee4\u5217\u51fa\u6587\u4ef6\u5c06\u6709\u52a9\u4e8e\u60a8\u5bfc\u822a\u6587\u4ef6\u7cfb\u7edf\u3002<\/p>\n<\/div>\n<p>\u5c06\u4ee5\u4e0b\u6a21\u578b\u5b9a\u4e49\u6dfb\u52a0\u5230\u6587\u4ef6\u4e2d\u3002<\/p>\n<div>prisma-graphql\/prisma\/schema.prisma \u6587\u4ef6\u4f4d\u4e8e prisma-graphql \u76ee\u5f55\u4e0b\u7684 prisma \u5b50\u76ee\u5f55\u4e2d<\/p>\n<pre class=\"post-pre\"><code>...\r\nmodel Post {\r\n  id        Int     @default(autoincrement()) @id\r\n  title     String\r\n  content   String?\r\n  published Boolean @default(false)\r\n}\r\n<\/code><\/pre>\n<\/div>\n<p>\u60a8\u5b9a\u4e49\u4e00\u4e2a\u540d\u4e3aPost\u7684\u6a21\u578b\uff0c\u5e76\u5305\u542b\u4e00\u4e9b\u5b57\u6bb5\u3002\u8be5\u6a21\u578b\u5c06\u88ab\u6620\u5c04\u5230\u6570\u636e\u5e93\u8868\uff0c\u8fd9\u4e9b\u5b57\u6bb5\u4ee3\u8868\u4e86\u5404\u4e2a\u5217\u3002<\/p>\n<p>id\u5b57\u6bb5\u5177\u6709\u4ee5\u4e0b\u5b57\u6bb5\u5c5e\u6027\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>@default(autoincrement()) \u4e3a\u5217\u8bbe\u7f6e\u81ea\u589e\u9ed8\u8ba4\u503c\u3002<\/li>\n<li>@id \u5c06\u5217\u8bbe\u7f6e\u4e3a\u8868\u7684\u4e3b\u952e\u3002<\/li>\n<\/ul>\n<p>\u4fdd\u5b58\u5e76\u9000\u51fa\u6587\u4ef6\u3002<\/p>\n<p>\u6709\u4e86\u6a21\u578b\u4e4b\u540e\uff0c\u60a8\u73b0\u5728\u53ef\u4ee5\u4f7f\u7528Prisma Migrate\u521b\u5efa\u76f8\u5e94\u7684\u6570\u636e\u8868\uff0c\u5e76\u4f7f\u7528migrate dev\u547d\u4ee4\u6765\u521b\u5efa\u5e76\u8fd0\u884c\u8fc1\u79fb\u6587\u4ef6\u3002<\/p>\n<p>\u8bf7\u5728\u60a8\u7684\u7ec8\u7aef\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\">npx prisma migrate dev <span class=\"token parameter variable\">&#8211;name<\/span> init &#8211;skip-generate<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u8fd9\u4e2a\u547d\u4ee4\u5728\u60a8\u7684\u6587\u4ef6\u7cfb\u7edf\u4e0a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8fc1\u79fb\uff0c\u5e76\u8fd0\u884c\u5b83\u6765\u521b\u5efa\u6570\u636e\u5e93\u67b6\u6784\u3002&#8211;name init \u6807\u5fd7\u6307\u5b9a\u8fc1\u79fb\u7684\u540d\u79f0\uff08\u5c06\u7528\u4e8e\u5728\u6587\u4ef6\u7cfb\u7edf\u4e0a\u521b\u5efa\u7684\u8fc1\u79fb\u6587\u4ef6\u5939\u7684\u547d\u540d\uff09\u3002&#8211;skip-generate \u6807\u5fd7\u8df3\u8fc7\u751f\u6210 Prisma Client\uff08\u8fd9\u5c06\u5728\u4e0b\u4e00\u6b65\u5b8c\u6210\uff09\u3002<\/p>\n<p>\u8fd9\u4e2a\u547d\u4ee4\u4f1a\u8f93\u51fa\u7c7b\u4f3c\u4e8e\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u73af\u5883\u53d8\u91cf\u4ece.env\u52a0\u8f7d<br \/>\nPrisma schema\u4eceprisma\/schema.prisma\u52a0\u8f7d<br \/>\n\u6570\u636e\u6e90&#8221;db&#8221;\uff1a\u4f4d\u4e8e&#8221;localhost:5432&#8243;\u7684PostgreSQL\u6570\u636e\u5e93&#8221;my-blog&#8221;\uff0cschema\u4e3a&#8221;public&#8221;<br \/>\nPostgreSQL\u6570\u636e\u5e93my-blog\u5728localhost:5432\u521b\u5efa<br \/>\n\u5e94\u7528\u8fc1\u79fb`<mark>20201201110111<\/mark>_init`<br \/>\n\u4ee5\u4e0b\u8fc1\u79fb\u5df2\u4ece\u65b0\u7684schema\u66f4\u6539\u4e2d\u521b\u5efa\u5e76\u5e94\u7528\uff1a<br \/>\nmigrations\/<br \/>\n\u2514\u2500 <mark>20201201110111<\/mark>_init\/<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;\u2514\u2500 migration.sql<br \/>\n\u60a8\u7684\u6570\u636e\u5e93\u73b0\u5728\u4e0e\u60a8\u7684schema\u540c\u6b65\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u73b0\u5728\u60a8\u7684prisma\/migrations\u76ee\u5f55\u5df2\u7ecf\u6709\u4e86SQL\u8fc1\u79fb\u6587\u4ef6\u3002\u8fd9\u79cd\u65b9\u5f0f\u53ef\u4ee5\u5e2e\u52a9\u60a8\u8ddf\u8e2a\u6570\u636e\u5e93schema\u7684\u53d8\u5316\uff0c\u5e76\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u521b\u5efa\u76f8\u540c\u7684\u6570\u636e\u5e93schema\u3002<\/p>\n<div class=\"post-conf-note\">\n<p class=\"post-conf-desc\">\u6ce8\u610f\uff1a<\/p>\n<p>\u5982\u679c\u60a8\u5df2\u7ecf\u4f7f\u7528Prisma Migrate\u5bf9my-blog\u6570\u636e\u5e93\u8fdb\u884c\u4e86\u8fc1\u79fb\uff0c\u5e76\u4e14\u5728prisma\/migration\u6587\u4ef6\u5939\u548c\u6570\u636e\u5e93schema\u4e4b\u95f4\u5b58\u5728\u4e0d\u4e00\u81f4\uff0c\u60a8\u5c06\u88ab\u63d0\u793a\u4f7f\u7528\u4ee5\u4e0b\u8f93\u51fa\u91cd\u7f6e\u6570\u636e\u5e93\uff1a<\/p>\n<p>\u8f93\u51fa\uff1f\u6211\u4eec\u9700\u8981\u91cd\u7f6e\u540d\u4e3a&#8221;my-blog&#8221;\u7684PostgreSQL\u6570\u636e\u5e93\uff0c\u5730\u5740\u4e3a&#8221;localhost:5432&#8243;\u3002\u6240\u6709\u6570\u636e\u5c06\u88ab\u5220\u9664\u3002<br \/>\n\u60a8\u662f\u5426\u8981\u7ee7\u7eed\uff1f\u203a\uff08\u662f\/\u5426\uff09\u60a8\u53ef\u4ee5\u8f93\u5165&#8221;\u662f&#8221;\u6765\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u8fd9\u5c06\u91cd\u7f6e\u6570\u636e\u5e93\u3002\u8bf7\u6ce8\u610f\uff0c\u8fd9\u5c06\u5bfc\u81f4\u6570\u636e\u5e93\u4e2d\u7684\u6240\u6709\u6570\u636e\u4e22\u5931\u3002<\/p>\n<\/div>\n<p>\u60a8\u5df2\u7ecf\u521b\u5efa\u4e86\u6570\u636e\u5e93schema\u3002\u5728\u4e0b\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u5b89\u88c5Prisma Client\u5e76\u5728GraphQL\u89e3\u6790\u5668\u4e2d\u4f7f\u7528\u5b83\u3002<\/p>\n<h2>\u7b2c\u516b\u6b65 &#8211; \u5728GraphQL\u89e3\u6790\u5668\u4e2d\u4f7f\u7528Prisma Client<\/h2>\n<p>Prisma Client \u662f\u4e00\u4e2a\u81ea\u52a8\u751f\u6210\u4e14\u7c7b\u578b\u5b89\u5168\u7684\u5bf9\u8c61\u5173\u7cfb\u6620\u5c04\u5668\uff08ORM\uff09\uff0c\u60a8\u53ef\u4ee5\u7528\u5b83\u6765\u5728 Node.js \u5e94\u7528\u7a0b\u5e8f\u4e2d\u4ee5\u7f16\u7a0b\u65b9\u5f0f\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e\u5e93\u4e2d\u7684\u6570\u636e\u3002\u5728\u8fd9\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u5728\u9879\u76ee\u4e2d\u5b89\u88c5 Prisma Client\u3002<\/p>\n<p>\u5728\u60a8\u7684\u7ec8\u7aef\u4e2d\u5b89\u88c5Prisma Client npm\u5305\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> @prisma\/client<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"post-conf-note\">\n<p class=\"post-conf-desc\">\u6ce8\u610f\uff1aPrisma Client\u901a\u8fc7\u6839\u636e\u4f60\u7684Prisma\u6a21\u5f0f\u751f\u6210\u4ee3\u7801\u6765\u4e3a\u4f60\u63d0\u4f9b\u4e30\u5bcc\u7684\u81ea\u52a8\u8865\u5168\u529f\u80fd\uff0c\u5e76\u5c06\u5176\u5b58\u50a8\u5230node_modules\u6587\u4ef6\u5939\u4e2d\u3002\u8981\u751f\u6210\u8fd9\u4e9b\u4ee3\u7801\uff0c\u4f60\u9700\u8981\u4f7f\u7528npx prisma generate\u547d\u4ee4\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u8fd9\u662f\u5728\u521b\u5efa\u548c\u8fd0\u884c\u65b0\u7684\u8fc1\u79fb\u4e4b\u540e\u5b8c\u6210\u7684\u3002\u7136\u800c\uff0c\u5728\u7b2c\u4e00\u6b21\u5b89\u88c5\u65f6\uff0c\u8fd9\u5e76\u4e0d\u662f\u5fc5\u8981\u7684\uff0c\u56e0\u4e3a\u5b83\u5c06\u5728\u5b89\u88c5\u540e\u81ea\u52a8\u901a\u8fc7postinstall\u94a9\u5b50\u751f\u6210\u3002\u5728\u521b\u5efa\u6570\u636e\u5e93\u548cGraphQL\u6a21\u5f0f\u4ee5\u53ca\u5b89\u88c5Prisma\u5ba2\u6237\u7aef\u4e4b\u540e\uff0c\u60a8\u5c06\u4f7f\u7528Prisma\u5ba2\u6237\u7aef\u5728GraphQL\u89e3\u6790\u5668\u4e2d\u8bfb\u5199\u6570\u636e\u5e93\u4e2d\u7684\u6570\u636e\u3002\u60a8\u5c06\u901a\u8fc7\u66ff\u6362\u76ee\u524d\u7528\u6765\u4fdd\u5b58\u6570\u636e\u7684\u5e16\u5b50\u6570\u7ec4\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\u3002<\/p>\n<\/div>\n<p>\u521b\u5efa\u5e76\u6253\u5f00\u4ee5\u4e0b\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> src\/db.js<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5c06\u4ee5\u4e0b\u884c\u6dfb\u52a0\u5230\u65b0\u6587\u4ef6\u4e2d\u3002<\/p>\n<p>prisma-graphql\/src\/db.js\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token maybe-class-name\">PrismaClient<\/span> <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">require<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'@prisma\/client'<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nmodule<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">exports<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token literal-property property\">prisma<\/span><span class=\"token operator\">:<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">PrismaClient<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u6bb5\u4ee3\u7801\u5bfc\u5165Prisma Client\uff0c\u521b\u5efa\u5b83\u7684\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u5e76\u5bfc\u51fa\u8be5\u5b9e\u4f8b\u4f9b\u60a8\u5728\u89e3\u6790\u5668\u4e2d\u4f7f\u7528\u3002<\/p>\n<p>\u73b0\u5728\u4fdd\u5b58\u5e76\u5173\u95edsrc\/db.js\u6587\u4ef6\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u60a8\u5c06\u4f1a\u628aPrisma\u5b9e\u4f8b\u5bfc\u5165\u5230src\/schema.js\u4e2d\u3002\u8981\u505a\u5230\u8fd9\u4e00\u70b9\uff0c\u8bf7\u6253\u5f00src\/schema.js\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> src\/schema.js<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5728\u6587\u4ef6\u5f00\u5934\u6dfb\u52a0\u8fd9\u884c\u4ee3\u7801\u6765\u5f15\u5165\u6765\u81ea.\/db\u7684prisma\uff1a<\/p>\n<p>src\/schema.js\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> prisma <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">require<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'.\/db'<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token spread operator\">...<\/span>\r\n<\/code><\/pre>\n<p>\u7136\u540e\u901a\u8fc7\u5220\u9664\u4ee5\u8fde\u5b57\u7b26\u7b26\u53f7\uff08-\uff09\u6807\u8bb0\u7684\u884c\u6765\u5220\u9664\u5e16\u5b50\u6570\u7ec4\u3002<\/p>\n<pre class=\"post-pre\"><code>...\r\n<span class=\"token deleted-sign deleted\"><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">const posts = [\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">  {\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    id: 1,\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    title: '\u8ba2\u9605GraphQL\u5468\u520a\u83b7\u53d6\u793e\u533a\u65b0\u95fb',\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    content: 'https:\/\/graphqlweekly.com\/',\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    published: true,\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">  },\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">  {\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    id: 2,\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    title: '\u5728Twitter\u4e0a\u5173\u6ce8Silicon Cloud',\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    content: 'https:\/\/twitter.com\/digitalocean',\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    published: true,\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">  },\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">  {\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    id: 3,\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    title: '\u4ec0\u4e48\u662fGraphQL\uff1f',\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    content: 'GraphQL\u662f\u4e00\u79cd\u7528\u4e8eAPI\u7684\u67e5\u8be2\u8bed\u8a00',\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">    published: false,\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">  },\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">]\r\n<\/span><\/span>...\r\n<\/code><\/pre>\n<p>\u4f60\u63a5\u4e0b\u6765\u8981\u66f4\u65b0\u67e5\u8be2\u89e3\u6790\u5668\uff0c\u4ece\u6570\u636e\u5e93\u4e2d\u83b7\u53d6\u5df2\u53d1\u5e03\u7684\u5e16\u5b50\u3002\u9996\u5148\uff0c\u5728resolvers.Query\u4e2d\u5220\u9664\u73b0\u6709\u7684\u884c\uff0c\u7136\u540e\u901a\u8fc7\u6dfb\u52a0\u7a81\u51fa\u663e\u793a\u7684\u884c\u6765\u66f4\u65b0\u5bf9\u8c61\u3002<\/p>\n<p>\u8fd9\u662f\u6587\u7ae0\u300a\u5982\u4f55\u4f7f\u7528Prisma\u6784\u5efaGraphQL API\uff0c\u5e76\u90e8\u7f72\u5230Silicon Cloud\u7684App\u5e73\u53f0\u300b\u7684\u7b2c12\u90e8\u5206\uff08\u517119\u90e8\u5206\uff09\u3002<\/p>\n<p>\u5185\u5bb9\u7247\u6bb5: <\/p>\n<pre class=\"post-pre\"><code><span class=\"token spread operator\">...<\/span>\r\n<span class=\"token keyword\">const<\/span> resolvers <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <mark><span class=\"token literal-property property\">Query<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n    <mark><span class=\"token function-variable function\">feed<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n      <mark><span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">findMany<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><\/mark>\r\n        <mark><span class=\"token literal-property property\">where<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n      <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/mark>\r\n    <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n    <mark><span class=\"token function-variable function\">post<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n      <mark><span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">findUnique<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><\/mark>\r\n        <mark><span class=\"token literal-property property\">where<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token known-class-name class-name\">Number<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n      <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/mark>\r\n    <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n  <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n<span class=\"token spread operator\">...<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u8fd9\u91cc\uff0c\u60a8\u4f7f\u7528\u4e86\u4e24\u4e2a Prisma Client \u67e5\u8be2\u3002<\/p>\n<ul class=\"post-ul\">\n<li>findMany \u83b7\u53d6 published \u5b57\u6bb5\u4e3a true \u7684\u5e16\u5b50\u3002<\/li>\n<li>findUnique \u83b7\u53d6 id \u5b57\u6bb5\u7b49\u4e8e GraphQL \u53c2\u6570 id \u7684\u5355\u4e2a\u5e16\u5b50\u3002<\/li>\n<\/ul>\n<p>\u6839\u636e GraphQL \u89c4\u8303\uff0cID \u7c7b\u578b\u7684\u5e8f\u5217\u5316\u65b9\u5f0f\u4e0e\u5b57\u7b26\u4e32\u76f8\u540c\u3002\u56e0\u6b64\uff0c\u60a8\u9700\u8981\u5c06\u5176\u8f6c\u6362\u4e3a\u6570\u5b57\uff0c\u56e0\u4e3a Prisma \u6a21\u5f0f\u4e2d\u7684 id \u662f\u4e00\u4e2a\u6574\u6570\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u60a8\u9700\u8981\u66f4\u65b0 Mutation \u89e3\u6790\u5668\uff0c\u5c06\u5e16\u5b50\u4fdd\u5b58\u548c\u66f4\u65b0\u5230\u6570\u636e\u5e93\u4e2d\u3002\u9996\u5148\uff0c\u5220\u9664 resolvers.Mutation \u5bf9\u8c61\u4e2d\u7684\u4ee3\u7801\u548c Number(args.id) \u884c\uff0c\u7136\u540e\u6dfb\u52a0\u9ad8\u4eae\u7684\u884c\u3002<\/p>\n<div>prisma-graphql\/src\/schema.js \u6587\u4ef6\u7684\u4e2d\u6587\u91ca\u4e49\u5982\u4e0b\uff1a<\/div>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">const<\/span> resolvers <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token spread operator\">...<\/span>\r\n  <mark><span class=\"token literal-property property\">Mutation<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n    <mark><span class=\"token function-variable function\">createDraft<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n      <mark><span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><\/mark>\r\n        <mark><span class=\"token literal-property property\">data<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">title<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">title<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">content<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">content<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n        <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n      <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/mark>\r\n    <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n    <mark><span class=\"token function-variable function\">publish<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n      <mark><span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><\/mark>\r\n        <mark><span class=\"token literal-property property\">where<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token known-class-name class-name\">Number<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n        <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n        <mark><span class=\"token literal-property property\">data<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n        <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n      <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/mark>\r\n    <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n  <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4f60\u6b63\u5728\u4f7f\u7528\u4e24\u4e2aPrisma Client\u67e5\u8be2\u3002<\/p>\n<ul class=\"post-ul\">\n<li>create\u7528\u4e8e\u521b\u5efaPost\u8bb0\u5f55\u3002<\/li>\n<li>update\u7528\u4e8e\u66f4\u65b0\u4e0e\u67e5\u8be2\u53c2\u6570\u4e2did\u5339\u914d\u7684Post\u8bb0\u5f55\u7684published\u5b57\u6bb5\u3002<\/li>\n<\/ul>\n<p>\u6700\u540e\uff0c\u79fb\u9664resolvers.Post\u5bf9\u8c61\u3002<\/p>\n<p>Prisma-GraphQL\u6e90\u4ee3\u7801\u4e2d\u7684schema.js\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>...\r\n<span class=\"token deleted-sign deleted\"><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">Post: {\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">  content: (parent) => parent.content,\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">  id: (parent) => parent.id,\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">  published: (parent) => parent.published,\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">  title: (parent) => parent.title,\r\n<\/span><span class=\"token prefix deleted\">-<\/span><span class=\"token line\">},\r\n<\/span><\/span>...\r\n<\/code><\/pre>\n<p>\u60a8\u7684schema.js\u6587\u4ef6\u5e94\u8be5\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> gql <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">require<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'apollo-server'<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> prisma <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">require<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'.\/db'<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> typeDefs <span class=\"token operator\">=<\/span> gql<span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token graphql language-graphql\">\r\n  <span class=\"token keyword\">type<\/span> <span class=\"token class-name\">Post<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token attr-name\">content<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span>\r\n    <span class=\"token attr-name\">id<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">ID<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">published<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">Boolean<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">title<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token operator\">!<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n\r\n  <span class=\"token keyword\">type<\/span> <span class=\"token class-name\">Query<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token attr-name\">feed<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token class-name\">Post<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">post<\/span><span class=\"token punctuation\">(<\/span><span class=\"token attr-name\">id<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">ID<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Post<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n\r\n  <span class=\"token keyword\">type<\/span> <span class=\"token class-name\">Mutation<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token attr-name\">createDraft<\/span><span class=\"token punctuation\">(<\/span><span class=\"token attr-name\">content<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token attr-name\">title<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Post<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">publish<\/span><span class=\"token punctuation\">(<\/span><span class=\"token attr-name\">id<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">ID<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Post<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n<\/span><span class=\"token template-punctuation string\">`<\/span><\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> resolvers <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token literal-property property\">Query<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token function-variable function\">feed<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">findMany<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token literal-property property\">where<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function-variable function\">post<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">findUnique<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token literal-property property\">where<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token known-class-name class-name\">Number<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token literal-property property\">Mutation<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token function-variable function\">createDraft<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token literal-property property\">data<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n          <span class=\"token literal-property property\">title<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">title<\/span><span class=\"token punctuation\">,<\/span>\r\n          <span class=\"token literal-property property\">content<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">content<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function-variable function\">publish<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token literal-property property\">where<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n          <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token known-class-name class-name\">Number<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token literal-property property\">data<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n          <span class=\"token literal-property property\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\nmodule<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">exports<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span>\r\n  resolvers<span class=\"token punctuation\">,<\/span>\r\n  typeDefs<span class=\"token punctuation\">,<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4fdd\u5b58\u5e76\u5173\u95ed\u6587\u4ef6\u3002<\/p>\n<p>\u65e2\u7136\u60a8\u5df2\u7ecf\u66f4\u65b0\u4e86\u89e3\u6790\u5668\u4ee5\u4f7f\u7528Prisma Client\uff0c\u73b0\u5728\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u542f\u52a8\u670d\u52a1\u5668\uff0c\u6d4b\u8bd5GraphQL API\u548c\u6570\u636e\u5e93\u4e4b\u95f4\u7684\u6570\u636e\u6d41\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">npm<\/span> start<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u518d\u6b21\uff0c\u60a8\u5c06\u6536\u5230\u4ee5\u4e0b\u8f93\u51fa\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Server ready at: http:\/\/localhost:8080<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u6253\u5f00Apollo GraphQL Studio\uff0c\u4f7f\u7528\u6b65\u9aa43\u4e2d\u7684\u76f8\u540c\u67e5\u8be2\uff0c\u5728\u8f93\u51fa\u4e2d\u63d0\u4f9b\u7684\u5730\u5740\u4e0a\u6d4b\u8bd5GraphQL API\u3002<\/p>\n<p>\u73b0\u5728\u4f60\u8981\u63d0\u4ea4\u4f60\u7684\u66f4\u6539\uff0c\u8fd9\u6837\u624d\u80fd\u5c06\u66f4\u6539\u90e8\u7f72\u5230 App \u5e73\u53f0\u3002\u4f7f\u7528 CTRL+C \u505c\u6b62 Apollo \u670d\u52a1\u5668\u3002<\/p>\n<p>\u4e3a\u4e86\u907f\u514d\u63d0\u4ea4node_modules\u6587\u4ef6\u5939\u548c.env\u6587\u4ef6\uff0c\u8bf7\u68c0\u67e5\u60a8\u9879\u76ee\u6587\u4ef6\u5939\u4e2d\u7684.gitignore\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">cat<\/span> .gitignore<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u8bf7\u786e\u8ba4\u4f60\u7684 .gitignore \u6587\u4ef6\u4e2d\u662f\u5426\u5305\u542b\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<div>prisma-graphql\/.gitignore \u7684\u91ca\u4e49\u548c\u4f5c\u7528<\/p>\n<pre class=\"post-pre\"><code>node_modules\r\n.env\r\n<\/code><\/pre>\n<p>\u5982\u679c\u4e0d\u5339\u914d\uff0c\u66f4\u65b0\u6587\u4ef6\u4f7f\u5176\u5339\u914d\u3002<\/p>\n<p>\u4fdd\u5b58\u5e76\u9000\u51fa\u6587\u4ef6\u3002<\/p>\n<p>\u7136\u540e\u8fd0\u884c\u4ee5\u4e0b\u4e24\u4e2a\u547d\u4ee4\u63d0\u4ea4\u66f4\u6539\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">git<\/span> <span class=\"token function\">add<\/span> <span class=\"token builtin class-name\">.<\/span><\/li>\n<li data-prefix=\"$\"><span class=\"token function\">git<\/span> commit <span class=\"token parameter variable\">-m<\/span> <span class=\"token string\">&#8216;Add Prisma&#8217;<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4f60\u4f1a\u6536\u5230\u8fd9\u6837\u7684\u8f93\u51fa\u56de\u590d\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>git commit -m &#8216;Add Prisma&#8217; [main 1646d07] Add Prisma 9 files changed, 157 insertions(+), 39 deletions(-) create mode 100644 .gitignore create mode 100644 docker-compose.yml create mode 100644 prisma\/migrations\/<mark>20201201110111<\/mark>_init\/migration.sql create mode 100644 prisma\/migrations\/migration_lock.toml create mode 100644 prisma\/schema.prisma create mode 100644 src\/db.js<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4f60\u5df2\u7ecf\u66f4\u65b0\u4e86\u4f60\u7684GraphQL\u89e3\u6790\u5668\uff0c\u4f7f\u7528Prisma\u5ba2\u6237\u7aef\u6765\u8fdb\u884c\u5bf9\u4f60\u7684\u6570\u636e\u5e93\u7684\u67e5\u8be2\u548c\u4fee\u6539\uff0c\u5e76\u5c06\u6240\u6709\u53d8\u66f4\u90fd\u63d0\u4ea4\u5230\u4e86\u8fdc\u7a0b\u4ed3\u5e93\u3002\u63a5\u4e0b\u6765\uff0c\u4f60\u5c06\u5728App Platform\u4e0a\u4e3a\u4f60\u7684\u5e94\u7528\u6dfb\u52a0\u4e00\u4e2aPostgreSQL\u6570\u636e\u5e93\u3002<\/p>\n<h2>\u7b2c\u4e5d\u6b65 &#8211; \u5728\u5e94\u7528\u5e73\u53f0\u4e2d\u521b\u5efa\u548c\u8fc1\u79fbPostgreSQL\u6570\u636e\u5e93\u5728\u8fd9\u4e2a\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u5728\u5e94\u7528\u5e73\u53f0\u4e2d\u4e3a\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u6dfb\u52a0\u4e00\u4e2aPostgreSQL\u6570\u636e\u5e93\u3002\u7136\u540e\uff0c\u60a8\u5c06\u4f7f\u7528Prisma Migrate\u6765\u5bf9\u5176\u8fd0\u884c\u8fc1\u79fb\uff0c\u4ee5\u4fbf\u90e8\u7f72\u7684\u6570\u636e\u5e93\u6a21\u5f0f\u4e0e\u60a8\u7684\u672c\u5730\u6570\u636e\u5e93\u5339\u914d\u3002<\/p>\n<p>\u9996\u5148\uff0c\u8bbf\u95ee\u201c\u5e94\u7528\u5e73\u53f0\u63a7\u5236\u53f0\u201d\uff0c\u7136\u540e\u9009\u62e9\u5728\u7b2c5\u6b65\u4e2d\u521b\u5efa\u7684\u201cprisma-graphql\u201d\u9879\u76ee\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u70b9\u51fb\u201c\u521b\u5efa\u201d\u6309\u94ae\uff0c\u7136\u540e\u4ece\u4e0b\u62c9\u83dc\u5355\u4e2d\u9009\u62e9\u201c\u521b\u5efa\/\u9644\u52a0\u6570\u636e\u5e93\u201d\uff0c\u8fd9\u5c06\u5e26\u60a8\u8fdb\u5165\u4e00\u4e2a\u9875\u9762\u6765\u914d\u7f6e\u60a8\u7684\u6570\u636e\u5e93\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/250-0.png\" alt=\"Screencapture displaying the Create\/Attach Database option in the dropdown menu\" \/>\u9009\u62e9Dev\u6570\u636e\u5e93\uff0c\u8f93\u5165\u4e00\u4e2a\u540d\u79f0\uff0c\u5e76\u70b9\u51fb\u521b\u5efa\u548c\u9644\u52a0\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/252-0.png\" alt=\"\" \/>\u5c06\u4f1a\u88ab\u91cd\u5b9a\u5411\u56de\u5230\u9879\u76ee\u89c6\u56fe\uff0c\u5728\u90a3\u91cc\u4f1a\u6709\u4e00\u4e2a\u521b\u5efa\u6570\u636e\u5e93\u7684\u8fdb\u5ea6\u6761\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/254-0.png\" alt=\"Screencapture displaying the Creating Database Progress Bar\" \/>\u5728\u521b\u5efa\u6570\u636e\u5e93\u4e4b\u540e\uff0c\u60a8\u5c06\u4ece\u672c\u5730\u8ba1\u7b97\u673a\u4e0a\u5bf9Silicon Cloud\u4e0a\u7684\u751f\u4ea7\u6570\u636e\u5e93\u8fd0\u884c\u6570\u636e\u5e93\u8fc1\u79fb\u3002\u4e3a\u4e86\u8fd0\u884c\u8fc1\u79fb\uff0c\u8bf7\u51c6\u5907\u597d\u6258\u7ba1\u6570\u636e\u5e93\u7684\u8fde\u63a5\u5b57\u7b26\u4e32\u3002<\/p>\n<p>\u8981\u83b7\u5f97\u5b83\uff0c\u8bf7\u5728\u8bbe\u7f6e\u9009\u9879\u5361\u7684\u7ec4\u4ef6\u90e8\u5206\u4e2d\u70b9\u51fbdb\u56fe\u6807\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/257-0.png\" alt=\"Screencapture displaying the Database Component Settings\" \/>\u5728\u201c\u8fde\u63a5\u8be6\u7ec6\u4fe1\u606f\u201d\u4e0b\uff0c\u70b9\u51fb\u201c\u67e5\u770b\u201d\uff0c\u7136\u540e\u5728\u4e0b\u62c9\u83dc\u5355\u4e2d\u9009\u62e9\u201c\u8fde\u63a5\u5b57\u7b26\u4e32\u201d\u3002\u590d\u5236\u6570\u636e\u5e93\u7684URL\uff0c\u5176\u7ed3\u6784\u5982\u4e0b\uff1a<\/p>\n<pre class=\"post-pre\"><code>postgresql:\/\/db:<mark>some_password<\/mark>@<mark>unique_identifier<\/mark>.db.ondigitalocean.com:25060\/db?sslmode=require\r\n<\/code><\/pre>\n<p>\u7136\u540e\uff0c\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u786e\u4fdd\u5c06your_db_connection_string\u8bbe\u7f6e\u4e3a\u521a\u521a\u590d\u5236\u7684URL\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token assign-left variable\">DATABASE_URL<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">&#8220;<mark>your_db_connection_string<\/mark>&#8220;<\/span> npx prisma migrate deploy<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u8fd0\u884c\u6b64\u547d\u4ee4\u5c06\u4f7f\u7528Prisma Migrate\u5bf9\u5b9e\u65f6\u6570\u636e\u5e93\u8fdb\u884c\u8fc1\u79fb\u3002<\/p>\n<p>\u5982\u679c\u8fc1\u79fb\u6210\u529f\uff0c\u60a8\u5c06\u6536\u5230\u4ee5\u4e0b\u8f93\u51fa\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>PostgreSQL database db created at unique_identifier.db.ondigitalocean.com:25060 Prisma Migrate applied the following migration(s): migrations\/ \u2514\u2500 <mark>20201201110111<\/mark>_init\/ \u2514\u2500 migration.sql<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u60a8\u5df2\u6210\u529f\u5c06\u751f\u4ea7\u6570\u636e\u5e93\u8fc1\u79fb\u5230Silicon Cloud\uff0c\u73b0\u5728\u4e0ePrisma\u67b6\u6784\u76f8\u5339\u914d\u3002<\/p>\n<div class=\"post-conf-note\">\n<p class=\"post-conf-desc\">Note<\/p>\n<div>\u6ce8\u610f\uff1a\u5982\u679c\u60a8\u6536\u5230\u4ee5\u4e0b\u9519\u8bef\u6d88\u606f\uff1a<br \/>\nOutputError\uff1a\u65e0\u6cd5\u5728`unique_identifier.db.ondigitalocean.com`:`25060`\u4e0a\u8fde\u63a5\u5230\u6570\u636e\u5e93\u670d\u52a1\u5668\u8bf7\u5bfc\u822a\u5230\u6570\u636e\u5e93\u4eea\u8868\u677f\uff0c\u786e\u8ba4\u60a8\u7684\u6570\u636e\u5e93\u5df2\u7ecf\u914d\u7f6e\u3002\u60a8\u53ef\u80fd\u9700\u8981\u66f4\u65b0\u6216\u7981\u7528\u6570\u636e\u5e93\u7684\u53d7\u4fe1\u4efb\u6765\u6e90\u3002\u73b0\u5728\u4f60\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u5c06Git\u66f4\u6539\u63a8\u9001\u6765\u90e8\u7f72\u4f60\u7684\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">git<\/span> push<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"post-conf-note\">\n<p class=\"post-conf-desc\">Note<\/p>\n<div>\u6ce8\u610f\uff1a\u5e94\u7528\u5e73\u53f0\u5c06\u5728\u8fd0\u884c\u65f6\u5411\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u63d0\u4f9bDATABASE_URL\u73af\u5883\u53d8\u91cf\u3002Prisma\u5ba2\u6237\u7aef\u5c06\u5728Prisma\u6a21\u5f0f\u7684datasource\u5757\u4e2d\u4f7f\u7528\u8be5\u73af\u5883\u53d8\u91cf\u4e0eenv\uff08&#8221;DATABASE_URL&#8221;\uff09\u3002\u8fd9\u4f1a\u81ea\u52a8\u89e6\u53d1\u6784\u5efa\u3002\u5982\u679c\u4f60\u6253\u5f00\u5e94\u7528\u5e73\u53f0\u63a7\u5236\u53f0\uff0c\u4f1a\u663e\u793a\u90e8\u7f72\u8fdb\u5ea6\u6761\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/271-0.png\" alt=\"Screencapture displaying the Deployment Progress Bar\" \/><br \/>\n\u4e00\u65e6\u90e8\u7f72\u6210\u529f\uff0c\u60a8\u5c06\u6536\u5230\u4e00\u4e2a\u90e8\u7f72\u4e0a\u7ebf\u7684\u6d88\u606f\u3002<\/p>\n<p>\u4f60\u73b0\u5728\u5df2\u7ecf\u901a\u8fc7\u6570\u636e\u5e93\u5907\u4efd\u4e86\u4f60\u90e8\u7f72\u7684GraphQL API\u3002\u6253\u5f00Live App\uff0c\u5b83\u4f1a\u5e26\u4f60\u5230Apollo GraphQL Studio\u3002\u4f7f\u7528\u7b2c\u4e09\u6b65\u7684\u76f8\u540c\u67e5\u8be2\u6765\u6d4b\u8bd5GraphQL API\u3002<\/p>\n<p>\u5728\u6700\u540e\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u901a\u8fc7\u6dfb\u52a0\u7528\u6237\u6a21\u578b\u6765\u8fdb\u4e00\u6b65\u53d1\u5c55GraphQL API\u3002<\/p>\n<h2>\u7b2c\u5341\u6b65 \u2014 \u6dfb\u52a0\u7528\u6237\u6a21\u578b\u60a8\u7684\u535a\u5ba2GraphQL API\u4ec5\u6709\u4e00\u4e2a\u540d\u4e3a\u201c\u5e16\u5b50\u201d\u7684\u5b9e\u4f53\u3002\u5728\u6b64\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u901a\u8fc7\u5728Prisma\u6a21\u5f0f\u4e2d\u5b9a\u4e49\u4e00\u4e2a\u65b0\u6a21\u578b\u5e76\u8c03\u6574GraphQL\u6a21\u5f0f\u6765\u4f7f\u7528\u8be5\u65b0\u6a21\u578b\u6765\u5b8c\u5584API\u3002\u60a8\u5c06\u5f15\u5165\u4e00\u4e2a\u540d\u4e3a\u201c\u7528\u6237\u201d\u7684\u6a21\u578b\uff0c\u5e76\u4f7f\u5176\u4e0e\u201c\u5e16\u5b50\u201d\u6a21\u578b\u5f62\u6210\u4e00\u5bf9\u591a\u7684\u5173\u7cfb\uff0c\u4ece\u800c\u4f7f\u60a8\u80fd\u591f\u8868\u793a\u5e16\u5b50\u7684\u4f5c\u8005\u5e76\u5c06\u591a\u4e2a\u5e16\u5b50\u5173\u8054\u5230\u6bcf\u4e2a\u7528\u6237\u3002\u7136\u540e\uff0c\u60a8\u5c06\u901a\u8fc7API\u5b8c\u5584GraphQL\u6a21\u5f0f\uff0c\u4ee5\u5141\u8bb8\u521b\u5efa\u7528\u6237\u5e76\u901a\u8fc7API\u5c06\u5e16\u5b50\u4e0e\u7528\u6237\u5173\u8054\u3002<\/p>\n<p>\u9996\u5148\uff0c\u6253\u5f00Prisma\u6a21\u5f0f\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> prisma\/schema.prisma<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5728Post\u6a21\u578b\u4e2d\u6dfb\u52a0\u9ad8\u4eae\u884c\u4ee5\u6dfb\u52a0authorId\u5b57\u6bb5\uff0c\u5e76\u5b9a\u4e49User\u6a21\u578b\u3002<\/p>\n<div>prisma-graphql\/prisma\/schema.prisma \u7684\u5185\u5bb9\u8fdb\u884c\u4e2d\u6587\u539f\u751f\u8bd1\u6587\uff1a<\/p>\n<pre class=\"post-pre\"><code>...\r\nmodel Post {\r\n  id        Int     @id @default(autoincrement())\r\n  title     String\r\n  content   String?\r\n  published Boolean @default(false)\r\n  <mark>author    User?   @relation(fields: [authorId], references: [id])<\/mark>\r\n  <mark>authorId  Int?<\/mark>\r\n}\r\n\r\n<mark>model User {<\/mark>\r\n  <mark>id    Int    @id @default(autoincrement())<\/mark>\r\n  <mark>email String @unique<\/mark>\r\n  <mark>name  String<\/mark>\r\n  <mark>posts Post[]<\/mark>\r\n<mark>}<\/mark>\r\n<\/code><\/pre>\n<p>\u4f60\u5df2\u6dfb\u52a0\u4e86\u4ee5\u4e0b\u9879\u76ee\u5230Prisma\u6a21\u5f0f:<\/p>\n<ul class=\"post-ul\">\n<li>Two relation fields: author and posts. Relation fields define connections between models at the Prisma level and do not exist in the database. These fields are used to generate the Prisma Client and to access relations with Prisma Client.<\/li>\n<li>The authorId field, which is referenced by the @relation attribute. Prisma will create a foreign key in the database to connect Post and User.<\/li>\n<li>The User model to represent users.<\/li>\n<\/ul>\n<p>\u5728\u5e16\u5b50\u6a21\u578b\u4e2d\u7684\u4f5c\u8005\u5b57\u6bb5\u662f\u53ef\u9009\u7684\uff0c\u4f46\u5141\u8bb8\u60a8\u521b\u5efa\u4e0e\u7528\u6237\u65e0\u5173\u7684\u5e16\u5b50\u3002<\/p>\n<p>\u5b8c\u6210\u540e\u4fdd\u5b58\u5e76\u9000\u51fa\u6587\u4ef6\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5728\u672c\u5730\u521b\u5efa\u5e76\u5e94\u7528\u8fc1\u79fb\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\">npx prisma migrate dev <span class=\"token parameter variable\">&#8211;name<\/span> <span class=\"token string\">&#8220;add-user&#8221;<\/span><\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5f53\u8fc1\u79fb\u6210\u529f\u65f6\uff0c\u60a8\u5c06\u6536\u5230\u4ee5\u4e0b\u6d88\u606f\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Environment variables loaded from .env Prisma schema loaded from prisma\/schema.prisma Datasource &#8220;db&#8221;: PostgreSQL database &#8220;my-blog&#8221;, schema &#8220;public&#8221; at &#8220;localhost:5432&#8221; Applying migration `<mark>20201201123056<\/mark>_add_user` The following migration(s) have been created and applied from new schema changes: migrations\/ \u2514\u2500 <mark>20201201123056<\/mark>_add_user\/ \u2514\u2500 migration.sql Your database is now in sync with your schema. \u2714 Generated Prisma Client (4.6.1 | library) to .\/node_modules\/@prisma\/client in 53ms<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u8be5\u547d\u4ee4\u8fd8\u4f1a\u751f\u6210Prisma Client\uff0c\u4ee5\u4fbf\u60a8\u80fd\u591f\u5229\u7528\u65b0\u7684\u8868\u683c\u548c\u5b57\u6bb5\u3002<\/p>\n<p>\u73b0\u5728\uff0c\u60a8\u5c06\u5728App\u5e73\u53f0\u4e0a\u9488\u5bf9\u751f\u4ea7\u6570\u636e\u5e93\u8fd0\u884c\u8fc1\u79fb\uff0c\u4ee5\u4f7f\u6570\u636e\u5e93\u6a21\u5f0f\u4e0e\u60a8\u7684\u672c\u5730\u6570\u636e\u5e93\u76f8\u540c\u3002\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u5e76\u5c06DATABASE_URL\u8bbe\u7f6e\u4e3a\u6765\u81eaApp\u5e73\u53f0\u7684\u8fde\u63a5URL\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token assign-left variable\">DATABASE_URL<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">&#8220;<mark>your_db_connection_string<\/mark>&#8220;<\/span> npx prisma migrate deploy<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4f60\u5c06\u6536\u5230\u4ee5\u4e0b\u8f93\u51fa\uff1a<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Environment variables loaded from .env Prisma schema loaded from prisma\/schema.prisma Datasource &#8220;db&#8221;: PostgreSQL database &#8220;db&#8221;, schema &#8220;public&#8221; at &#8220;unique_identifier.db.ondigitalocean.com:25060&#8221; 2 migrations found in prisma\/migrations Applying migration `<mark>20201201123056<\/mark>_add_user` The following migration have been applied: migrations\/ \u2514\u2500 <mark>20201201123056<\/mark>_add_user\/ \u2514\u2500 migration.sql All migrations have been successfully applied.<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4f60\u9700\u8981\u73b0\u5728\u66f4\u65b0GraphQL\u6a21\u5f0f\u548c\u89e3\u6790\u5668\uff0c\u4ee5\u4fbf\u4f7f\u7528\u66f4\u65b0\u540e\u7684\u6570\u636e\u5e93\u6a21\u5f0f\u3002<\/p>\n<p>\u6253\u5f00 src\/schema.js \u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">nano<\/span> src\/schema.js<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u8bf7\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u4f7f\u7528\u7a81\u51fa\u663e\u793a\u7684\u884c\u66f4\u65b0typeDefs\uff1a<\/p>\n<div>prisma-graphql\/src\/schema.js\u7684\u5185\u5bb9\u8fdb\u884c\u672c\u5730\u4e2d\u6587\u91ca\u4e49\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"token spread operator\">...<\/span>\r\n<span class=\"token keyword\">const<\/span> typeDefs <span class=\"token operator\">=<\/span> gql<span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token graphql language-graphql\">\r\n  <mark><span class=\"token keyword\">type<\/span> <span class=\"token class-name\">User<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n    <mark><span class=\"token attr-name\">email<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token operator\">!<\/span><\/mark>\r\n    <mark><span class=\"token attr-name\">id<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">ID<\/span><span class=\"token operator\">!<\/span><\/mark>\r\n    <mark><span class=\"token attr-name\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><\/mark>\r\n    <mark><span class=\"token attr-name\">posts<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token class-name\">Post<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">!<\/span><\/mark>\r\n  <mark><span class=\"token punctuation\">}<\/span><\/mark>\r\n\r\n  <span class=\"token keyword\">type<\/span> <span class=\"token class-name\">Post<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token attr-name\">content<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span>\r\n    <span class=\"token attr-name\">id<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">ID<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">published<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">Boolean<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">title<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token operator\">!<\/span>\r\n    <mark><span class=\"token attr-name\">author<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">User<\/span><\/mark>\r\n  <span class=\"token punctuation\">}<\/span>\r\n\r\n  <span class=\"token keyword\">type<\/span> <span class=\"token class-name\">Query<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token attr-name\">feed<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token class-name\">Post<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">post<\/span><span class=\"token punctuation\">(<\/span><span class=\"token attr-name\">id<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">ID<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Post<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n\r\n  <span class=\"token keyword\">type<\/span> <span class=\"token class-name\">Mutation<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <mark><span class=\"token attr-name\">createUser<\/span><span class=\"token punctuation\">(<\/span><span class=\"token attr-name\">data<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token atom-input class-name\">UserCreateInput<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">User<\/span><span class=\"token operator\">!<\/span><\/mark>\r\n    <span class=\"token attr-name\">createDraft<\/span><span class=\"token punctuation\">(<\/span><mark><span class=\"token attr-name\">authorEmail<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token punctuation\">,<\/span> <\/mark><span class=\"token attr-name\">content<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token attr-name\">title<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Post<\/span><span class=\"token operator\">!<\/span>\r\n    <span class=\"token attr-name\">publish<\/span><span class=\"token punctuation\">(<\/span><span class=\"token attr-name\">id<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">ID<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Post<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n\r\n  <mark><span class=\"token keyword\">input<\/span> <span class=\"token atom-input class-name\">UserCreateInput<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n    <mark><span class=\"token attr-name\">email<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token operator\">!<\/span><\/mark>\r\n    <mark><span class=\"token attr-name\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><\/mark>\r\n    <mark><span class=\"token attr-name\">posts<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token atom-input class-name\">PostCreateWithoutAuthorInput<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">]<\/span><\/mark>\r\n  <mark><span class=\"token punctuation\">}<\/span><\/mark>\r\n\r\n  <mark><span class=\"token keyword\">input<\/span> <span class=\"token atom-input class-name\">PostCreateWithoutAuthorInput<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n    <mark><span class=\"token attr-name\">content<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><\/mark>\r\n    <mark><span class=\"token attr-name\">published<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">Boolean<\/span><\/mark>\r\n    <mark><span class=\"token attr-name\">title<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token scalar\">String<\/span><span class=\"token operator\">!<\/span><\/mark>\r\n  <mark><span class=\"token punctuation\">}<\/span><\/mark>\r\n<\/span><span class=\"token template-punctuation string\">`<\/span><\/span>\r\n<span class=\"token spread operator\">...<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u8fd9\u4e2a\u66f4\u65b0\u7684\u4ee3\u7801\u4e2d\uff0c\u60a8\u5411GraphQL\u6a21\u5f0f\u4e2d\u6dfb\u52a0\u4e86\u4ee5\u4e0b\u66f4\u6539\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>User\u7c7b\u578b\uff0c\u8fd4\u56de\u4e00\u4e2aPost\u6570\u7ec4\u3002<\/li>\n<li>\u5411Post\u7c7b\u578b\u6dfb\u52a0\u4e86author\u5b57\u6bb5\u3002<\/li>\n<li>createUser\u53d8\u66f4\uff0c\u5b83\u671f\u671bUserCreateInput\u4f5c\u4e3a\u5176\u8f93\u5165\u7c7b\u578b\u3002<\/li>\n<li>\u5728UserCreateInput\u8f93\u5165\u4e2d\u4f7f\u7528\u7684PostCreateWithoutAuthorInput\u8f93\u5165\u7c7b\u578b\uff0c\u7528\u4e8e\u4f5c\u4e3acreateUser\u53d8\u66f4\u7684\u4e00\u90e8\u5206\u521b\u5efa\u5e16\u5b50\u3002<\/li>\n<li>\u5411createDraft\u53d8\u66f4\u6dfb\u52a0\u4e86authorEmail\u53ef\u9009\u53c2\u6570\u3002<\/li>\n<\/ul>\n<p>\u968f\u7740\u6a21\u5f0f\u7684\u66f4\u65b0\uff0c\u60a8\u73b0\u5728\u9700\u8981\u66f4\u65b0\u89e3\u6790\u5668\u4ee5\u5339\u914d\u6a21\u5f0f\u3002<\/p>\n<p>\u5c06\u9ad8\u4eae\u7684\u884c\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u66f4\u65b0\u89e3\u6790\u5668\u5bf9\u8c61\uff1a<\/p>\n<div>prisma-graphql\/src\/schema.js -&gt; Prisma\u7684GraphQL\u6a21\u5f0f\u6587\u4ef6<\/div>\n<pre class=\"post-pre\"><code><span class=\"token spread operator\">...<\/span>\r\n<span class=\"token keyword\">const<\/span> resolvers <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token literal-property property\">Query<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token function-variable function\">feed<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">findMany<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token literal-property property\">where<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function-variable function\">post<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">findUnique<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token literal-property property\">where<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token known-class-name class-name\">Number<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n      <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\r\n  <mark><span class=\"token literal-property property\">Mutation<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n    <mark><span class=\"token function-variable function\">createDraft<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n      <mark><span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><\/mark>\r\n        <mark><span class=\"token literal-property property\">data<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">title<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">title<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">content<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">content<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">author<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">authorEmail<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n            <mark><span class=\"token literal-property property\">connect<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">email<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">authorEmail<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n          <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n        <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n      <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/mark>\r\n    <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n    <mark><span class=\"token function-variable function\">publish<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n      <mark><span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><\/mark>\r\n        <mark><span class=\"token literal-property property\">where<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> <span class=\"token known-class-name class-name\">Number<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n        <mark><span class=\"token literal-property property\">data<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">published<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n        <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n      <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/mark>\r\n    <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n    <mark><span class=\"token function-variable function\">createUser<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n      <mark><span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">user<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><\/mark>\r\n        <mark><span class=\"token literal-property property\">data<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">email<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">data<\/span><span class=\"token punctuation\">.<\/span><span class=\"token property-access\">email<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">data<\/span><span class=\"token punctuation\">.<\/span><span class=\"token property-access\">name<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">posts<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n            <mark><span class=\"token literal-property property\">create<\/span><span class=\"token operator\">:<\/span> args<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">data<\/span><span class=\"token punctuation\">.<\/span><span class=\"token property-access\">posts<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n          <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n        <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n      <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/mark>\r\n    <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n  <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n  <mark><span class=\"token literal-property property\">User<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n    <mark><span class=\"token function-variable function\">posts<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n      <mark><span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">user<\/span><\/mark>\r\n        <span class=\"token punctuation\">.<\/span><mark><span class=\"token method function property-access\">findUnique<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">where<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> parent<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n        <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/mark>\r\n        <span class=\"token punctuation\">.<\/span><mark><span class=\"token method function property-access\">posts<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/mark>\r\n    <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n  <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n  <mark><span class=\"token literal-property property\">Post<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n    <mark><span class=\"token function-variable function\">author<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">parent<span class=\"token punctuation\">,<\/span> args<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span><\/mark>\r\n      <mark><span class=\"token keyword control-flow\">return<\/span> prisma<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">post<\/span><\/mark>\r\n        <span class=\"token punctuation\">.<\/span><mark><span class=\"token method function property-access\">findUnique<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><\/mark>\r\n          <mark><span class=\"token literal-property property\">where<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">id<\/span><span class=\"token operator\">:<\/span> parent<span class=\"token punctuation\">.<\/span><span class=\"token property-access\">id<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n        <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/mark>\r\n        <span class=\"token punctuation\">.<\/span><mark><span class=\"token method function property-access\">author<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/mark>\r\n    <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n  <mark><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/mark>\r\n<span class=\"token punctuation\">}<\/span>\r\n<span class=\"token spread operator\">...<\/span>\r\n<\/code><\/pre>\n<p>\u73b0\u5728\uff0c<code>createDraft<\/code>\u7684\u53d8\u66f4\u89e3\u6790\u5668\u4f7f\u7528<code>authorEmail<\/code>\u53c2\u6570\uff08\u5982\u679c\u5df2\u4f20\u9012\uff09\u6765\u521b\u5efa\u5df2\u521b\u5efa\u7684\u8349\u7a3f\u4e0e\u73b0\u6709\u7528\u6237\u4e4b\u95f4\u7684\u5173\u7cfb\u3002<\/p>\n<p>\u65b0\u7684<code>createUser<\/code>\u53d8\u66f4\u89e3\u6790\u5668\u4f7f\u7528\u5d4c\u5957\u5199\u5165\u529f\u80fd\u521b\u5efa\u7528\u6237\u548c\u76f8\u5173\u5e16\u5b50\u3002<\/p>\n<p>\u5f53\u67e5\u8be2<code>User<\/code>\u6216<code>Post<\/code>\u65f6\uff0c\u6839\u636e<code>User.posts<\/code>\u548c<code>Post.author<\/code>\u89e3\u6790\u5668\u6765\u5b9a\u4e49\u5982\u4f55\u89e3\u6790<code>posts<\/code>\u548c<code>author<\/code>\u5b57\u6bb5\u3002\u4f7f\u7528Prisma\u7684Fluent API\u6765\u83b7\u53d6\u76f8\u5173\u5173\u7cfb\u3002<\/p>\n<p>\u4fdd\u5b58\u5e76\u9000\u51fa\u6587\u4ef6\u3002<\/p>\n<p>\u542f\u52a8\u670d\u52a1\u5668\u4ee5\u6d4b\u8bd5GraphQL API\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">npm<\/span> start<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u5f00\u59cb\u901a\u8fc7\u4ee5\u4e0bGraphQL\u53d8\u66f4\u6d4b\u8bd5<code>createUser<\/code>\u89e3\u6790\u5668\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">mutation<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token property-query property-mutation\">createUser<\/span><span class=\"token punctuation\">(<\/span><span class=\"token attr-name\">data<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token attr-name\">email<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"natalia@prisma.io\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token attr-name\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"Natalia\"<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token property\">email<\/span>\r\n    <span class=\"token property\">id<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u79cd\u53d8\u66f4\u5c06\u4f1a\u521b\u5efa\u4e00\u4e2a\u7528\u6237\u3002<\/p>\n<p>\u63a5\u4e0b\u6765, \u4f7f\u7528\u4ee5\u4e0b\u53d8\u66f4\u6d4b\u8bd5 <code>createDraft<\/code> \u89e3\u6790\u5668:<\/p>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">mutation<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token property-query property-mutation\">createDraft<\/span><span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token attr-name\">authorEmail<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token description string\">\"<span class=\"token language-markdown\">natalia@prisma.io<\/span>\"<\/span>\r\n    <span class=\"token attr-name\">title<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"\u5c06GraphQL API\u90e8\u7f72\u5230App\u5e73\u53f0\"<\/span>\r\n  <span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token property\">id<\/span>\r\n    <span class=\"token property\">title<\/span>\r\n    <span class=\"token property\">content<\/span>\r\n    <span class=\"token property\">published<\/span>\r\n    <span class=\"token object\">author<\/span> <span class=\"token punctuation\">{<\/span>\r\n      <span class=\"token property\">id<\/span>\r\n      <span class=\"token property\">name<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u67e5\u8be2\u7684\u8fd4\u56de\u503c\u662f\u5e16\u5b50\u65f6\uff0c\u60a8\u53ef\u4ee5\u83b7\u53d6\u4f5c\u8005\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u5c06\u8c03\u7528\u5e16\u5b50\u4f5c\u8005\u7684\u89e3\u6790\u5668\u3002<\/p>\n<p>\u6d4b\u8bd5\u5b8c\u6210\u540e\u5173\u95ed\u670d\u52a1\u5668\u3002<\/p>\n<p>\u7136\u540e\u63d0\u4ea4\u60a8\u7684\u66f4\u6539\u5e76\u63a8\u9001\u4ee5\u90e8\u7f72API\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<ol>\n<li data-prefix=\"$\"><span class=\"token function\">git<\/span> <span class=\"token function\">add<\/span> <span class=\"token builtin class-name\">.<\/span><\/li>\n<li data-prefix=\"$\"><span class=\"token function\">git<\/span> commit <span class=\"token parameter variable\">-m<\/span> <span class=\"token string\">&#8220;\u6dfb\u52a0\u7528\u6237\u6a21\u578b&#8221;<\/span><\/li>\n<li data-prefix=\"$\"><span class=\"token function\">git<\/span> push<\/li>\n<\/ol>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u4f60\u7684\u66f4\u65b0\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\u6765\u90e8\u7f72\u3002<\/p>\n<p>\u4f60\u5df2\u7ecf\u6210\u529f\u7528 Prisma Migrate \u8fdb\u5316\u4e86\u4f60\u7684\u6570\u636e\u5e93\u6a21\u5f0f\uff0c\u5e76\u5c06\u65b0\u6a21\u578b\u66b4\u9732\u5728\u4f60\u7684 GraphQL API \u4e2d\u3002<\/p>\n<h2>\u7ed3\u8bba<\/h2>\n<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u4f60\u5b66\u4e60\u4e86\u5982\u4f55\u4f7f\u7528Prisma\u6784\u5efaGraphQL API\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u5230Silicon Cloud\u7684App\u5e73\u53f0\u3002\u4f60\u4e86\u89e3\u4e86\u5982\u4f55\u5b9a\u4e49GraphQL\u6a21\u5f0f\uff0c\u521b\u5efa\u89e3\u6790\u5668\uff0c\u4ee5\u53ca\u5982\u4f55\u4f7f\u7528Prisma\u5ba2\u6237\u7aef\u4e0e\u6570\u636e\u5e93\u8fdb\u884c\u4ea4\u4e92\u3002\u6b64\u5916\uff0c\u4f60\u8fd8\u5b66\u4e60\u4e86\u5982\u4f55\u6d4b\u8bd5\u4f60\u7684API\u5e76\u5c06\u5176\u90e8\u7f72\u5230\u4e91\u5e73\u53f0\u3002<\/p>\n<p>\u5728\u672c\u6587\u4e2d\uff0c\u60a8\u4f7f\u7528Prisma\u6784\u5efa\u4e86\u4e00\u4e2aGraphQL API\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u5230Silicon Cloud\u7684\u5e94\u7528\u5e73\u53f0\u4e0a\u3002\u60a8\u4f7f\u7528Apollo Server\u5b9a\u4e49\u4e86\u4e00\u4e2aGraphQL\u6a21\u5f0f\u548c\u89e3\u6790\u5668\u3002\u7136\u540e\uff0c\u5728GraphQL\u89e3\u6790\u5668\u4e2d\u4f7f\u7528Prisma Client\u5c06\u6570\u636e\u6301\u4e45\u5316\u5e76\u67e5\u8be2PostgreSQL\u6570\u636e\u5e93\u3002\u4f5c\u4e3a\u4e0b\u4e00\u6b65\uff0c\u60a8\u53ef\u4ee5\u901a\u8fc7\u4e00\u4e2a\u67e5\u8be2\u6269\u5c55GraphQL API\uff0c\u4ee5\u83b7\u53d6\u5355\u4e2a\u7528\u6237\uff0c\u5e76\u901a\u8fc7\u4e00\u4e2a\u53d8\u66f4\u5c06\u73b0\u6709\u8349\u7a3f\u8fde\u63a5\u5230\u7528\u6237\u3002<\/p>\n<p>\u5982\u679c\u60a8\u5bf9\u63a2\u7d22\u6570\u636e\u5e93\u4e2d\u7684\u6570\u636e\u611f\u5174\u8da3\uff0c\u8bf7\u67e5\u770bPrisma Studio\u3002\u60a8\u4e5f\u53ef\u4ee5\u8bbf\u95eePrisma\u6587\u6863\uff0c\u4e86\u89e3Prisma\u7684\u4e0d\u540c\u65b9\u9762\uff0c\u5e76\u5728prisma-examples\u5b58\u50a8\u5e93\u4e2d\u63a2\u7d22\u4e00\u4e9b\u51c6\u5907\u597d\u8fd0\u884c\u7684\u793a\u4f8b\u9879\u76ee\u3002<\/p>\n<p>\u60a8\u53ef\u4ee5\u5728Silicon Cloud\u793e\u533a\u4ee3\u7801\u5e93\u4e2d\u627e\u5230\u8be5\u9879\u76ee\u7684\u4ee3\u7801\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5f15\u8a00 GraphQL\u662f\u4e00\u79cd\u7528\u4e8eAPI\u7684\u67e5\u8be2\u8bed\u8a00\uff0c\u7531\u6a21\u5f0f\u5b9a\u4e49\u8bed\u8a00\u548c\u67e5\u8be2\u8bed\u8a00\u7ec4\u6210\uff0c\u5141\u8bb8API\u6d88\u8d39\u8005\u4ec5\u83b7\u53d6\u4ed6\u4eec\u9700\u8981\u7684 [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[2179,2178,2180],"class_list":["post-827","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-graphql-api","tag-prisma","tag-silicon-cloud"],"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>Prisma\u6784\u5efaGraphQL API\u5b8c\u6574\u6307\u5357\uff1aSilicon Cloud\u5e73\u53f0\u90e8\u7f72\u6559\u7a0b - Blog - Silicon Cloud<\/title>\n<meta name=\"description\" content=\"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Prisma\u6784\u5efa\u9ad8\u6548\u7684GraphQL API\uff0c\u5e76\u5b8c\u6210\u5728Silicon Cloud App\u5e73\u53f0\u7684\u90e8\u7f72\u3002\u672c\u6559\u7a0b\u63d0\u4f9b\u8be6\u7ec6\u6b65\u9aa4\u3001\u6700\u4f73\u5b9e\u8df5\u548c\u5e38\u89c1\u95ee\u9898\u89e3\u51b3\u65b9\u6848\uff0c\u9002\u5408\u5f00\u53d1\u8005\u5feb\u901f\u638c\u63e1\u73b0\u4ee3API\u5f00\u53d1\u4e0e\u4e91\u90e8\u7f72\u6280\u672f\u3002\" \/>\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\/\u5982\u4f55\u4f7f\u7528prisma\u6784\u5efagraphql-api\uff0c\u5e76\u90e8\u7f72\u5230siliconcloud\u7684app\u5e73\u53f0\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Prisma\u6784\u5efaGraphQL API\u5b8c\u6574\u6307\u5357\uff1aSilicon Cloud\u5e73\u53f0\u90e8\u7f72\u6559\u7a0b\" \/>\n<meta property=\"og:description\" content=\"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Prisma\u6784\u5efa\u9ad8\u6548\u7684GraphQL API\uff0c\u5e76\u5b8c\u6210\u5728Silicon Cloud App\u5e73\u53f0\u7684\u90e8\u7f72\u3002\u672c\u6559\u7a0b\u63d0\u4f9b\u8be6\u7ec6\u6b65\u9aa4\u3001\u6700\u4f73\u5b9e\u8df5\u548c\u5e38\u89c1\u95ee\u9898\u89e3\u51b3\u65b9\u6848\uff0c\u9002\u5408\u5f00\u53d1\u8005\u5feb\u901f\u638c\u63e1\u73b0\u4ee3API\u5f00\u53d1\u4e0e\u4e91\u90e8\u7f72\u6280\u672f\u3002\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528prisma\u6784\u5efagraphql-api\uff0c\u5e76\u90e8\u7f72\u5230siliconcloud\u7684app\u5e73\u53f0\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-23T16:04:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-03T03:27:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/83-0.png\" \/>\n<meta name=\"author\" content=\"\u96c5, \u609f\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u96c5, \u609f\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 \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\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/\",\"name\":\"Prisma\u6784\u5efaGraphQL API\u5b8c\u6574\u6307\u5357\uff1aSilicon Cloud\u5e73\u53f0\u90e8\u7f72\u6559\u7a0b - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-08-23T16:04:04+00:00\",\"dateModified\":\"2025-08-03T03:27:38+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\"},\"description\":\"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Prisma\u6784\u5efa\u9ad8\u6548\u7684GraphQL API\uff0c\u5e76\u5b8c\u6210\u5728Silicon Cloud App\u5e73\u53f0\u7684\u90e8\u7f72\u3002\u672c\u6559\u7a0b\u63d0\u4f9b\u8be6\u7ec6\u6b65\u9aa4\u3001\u6700\u4f73\u5b9e\u8df5\u548c\u5e38\u89c1\u95ee\u9898\u89e3\u51b3\u65b9\u6848\uff0c\u9002\u5408\u5f00\u53d1\u8005\u5feb\u901f\u638c\u63e1\u73b0\u4ee3API\u5f00\u53d1\u4e0e\u4e91\u90e8\u7f72\u6280\u672f\u3002\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Prisma\u6784\u5efaGraphQL API\u5b8c\u6574\u6307\u5357\uff1aSilicon Cloud\u5e73\u53f0\u90e8\u7f72\u6559\u7a0b\"}]},{\"@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\/f044a4b7fa4ee2701702942002419ca6\",\"name\":\"\u96c5, \u609f\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"caption\":\"\u96c5, \u609f\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Prisma\u6784\u5efaGraphQL API\u5b8c\u6574\u6307\u5357\uff1aSilicon Cloud\u5e73\u53f0\u90e8\u7f72\u6559\u7a0b - Blog - Silicon Cloud","description":"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Prisma\u6784\u5efa\u9ad8\u6548\u7684GraphQL API\uff0c\u5e76\u5b8c\u6210\u5728Silicon Cloud App\u5e73\u53f0\u7684\u90e8\u7f72\u3002\u672c\u6559\u7a0b\u63d0\u4f9b\u8be6\u7ec6\u6b65\u9aa4\u3001\u6700\u4f73\u5b9e\u8df5\u548c\u5e38\u89c1\u95ee\u9898\u89e3\u51b3\u65b9\u6848\uff0c\u9002\u5408\u5f00\u53d1\u8005\u5feb\u901f\u638c\u63e1\u73b0\u4ee3API\u5f00\u53d1\u4e0e\u4e91\u90e8\u7f72\u6280\u672f\u3002","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\/\u5982\u4f55\u4f7f\u7528prisma\u6784\u5efagraphql-api\uff0c\u5e76\u90e8\u7f72\u5230siliconcloud\u7684app\u5e73\u53f0\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"Prisma\u6784\u5efaGraphQL API\u5b8c\u6574\u6307\u5357\uff1aSilicon Cloud\u5e73\u53f0\u90e8\u7f72\u6559\u7a0b","og_description":"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Prisma\u6784\u5efa\u9ad8\u6548\u7684GraphQL API\uff0c\u5e76\u5b8c\u6210\u5728Silicon Cloud App\u5e73\u53f0\u7684\u90e8\u7f72\u3002\u672c\u6559\u7a0b\u63d0\u4f9b\u8be6\u7ec6\u6b65\u9aa4\u3001\u6700\u4f73\u5b9e\u8df5\u548c\u5e38\u89c1\u95ee\u9898\u89e3\u51b3\u65b9\u6848\uff0c\u9002\u5408\u5f00\u53d1\u8005\u5feb\u901f\u638c\u63e1\u73b0\u4ee3API\u5f00\u53d1\u4e0e\u4e91\u90e8\u7f72\u6280\u672f\u3002","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528prisma\u6784\u5efagraphql-api\uff0c\u5e76\u90e8\u7f72\u5230siliconcloud\u7684app\u5e73\u53f0\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-08-23T16:04:04+00:00","article_modified_time":"2025-08-03T03:27:38+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/65644ec5a4b2f92e6c71f171\/83-0.png"}],"author":"\u96c5, \u609f","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u96c5, \u609f","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"11 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/","name":"Prisma\u6784\u5efaGraphQL API\u5b8c\u6574\u6307\u5357\uff1aSilicon Cloud\u5e73\u53f0\u90e8\u7f72\u6559\u7a0b - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-08-23T16:04:04+00:00","dateModified":"2025-08-03T03:27:38+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6"},"description":"\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Prisma\u6784\u5efa\u9ad8\u6548\u7684GraphQL API\uff0c\u5e76\u5b8c\u6210\u5728Silicon Cloud App\u5e73\u53f0\u7684\u90e8\u7f72\u3002\u672c\u6559\u7a0b\u63d0\u4f9b\u8be6\u7ec6\u6b65\u9aa4\u3001\u6700\u4f73\u5b9e\u8df5\u548c\u5e38\u89c1\u95ee\u9898\u89e3\u51b3\u65b9\u6848\uff0c\u9002\u5408\u5f00\u53d1\u8005\u5feb\u901f\u638c\u63e1\u73b0\u4ee3API\u5f00\u53d1\u4e0e\u4e91\u90e8\u7f72\u6280\u672f\u3002","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"Prisma\u6784\u5efaGraphQL API\u5b8c\u6574\u6307\u5357\uff1aSilicon Cloud\u5e73\u53f0\u90e8\u7f72\u6559\u7a0b"}]},{"@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\/f044a4b7fa4ee2701702942002419ca6","name":"\u96c5, \u609f","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","caption":"\u96c5, \u609f"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8prisma%e6%9e%84%e5%bb%bagraphql-api%ef%bc%8c%e5%b9%b6%e9%83%a8%e7%bd%b2%e5%88%b0siliconcloud%e7%9a%84app%e5%b9%b3%e5%8f%b0%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/827","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\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=827"}],"version-history":[{"count":6,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/827\/revisions"}],"predecessor-version":[{"id":110753,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/827\/revisions\/110753"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=827"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=827"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=827"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}