{"id":330371,"date":"2022-03-06T15:00:26","date_gmt":"2022-03-06T15:00:26","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=330371"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=330371","title":{"rendered":"<span>Prisma ORM: \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e). \u0427\u0430\u0441\u0442\u044c 2<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ax\/ev\/zk\/axevzkfcmhrfdfb4j8j9hg12xj0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ax\/ev\/zk\/axevzkfcmhrfdfb4j8j9hg12xj0.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f!<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0438\u0437 2 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c\u0438 \u043e <a href=\"https:\/\/www.prisma.io\/\"><code>Prisma<\/code><\/a>.<\/p>\n<p>  <\/p>\n<p><code>Prisma<\/code> \u2014 \u044d\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 (\u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0435) <a href=\"https:\/\/ru.wikipedia.org\/wiki\/ORM\">\u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/a> (Object-Relational Mapping, ORM) \u0434\u043b\u044f <code>Node.js<\/code> \u0438 <code>TypeScript<\/code>. \u041f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, <code>Prisma<\/code> \u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 (<code>PostgreSQL<\/code>, <code>MySQL<\/code>, <code>SQL Server<\/code>, <code>SQLite<\/code>) \u0438 \u043d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 (<code>MongoDB<\/code>) \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>JavaScript<\/code> \u0438\u043b\u0438 <code>TypeScript<\/code> \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/SQL\"><code>SQL<\/code><\/a> (\u0445\u043e\u0442\u044f \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u0435\u0442\u0441\u044f).<\/p>\n<p>  <\/p>\n<h2 id=\"soderzhanie-etoy-chasti\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"#%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/a><br \/> \n<ul>\n<li><a href=\"#select\">select<\/a><\/li>\n<li><a href=\"#include\">include<\/a><\/li>\n<li><a href=\"#where\">where<\/a><\/li>\n<li><a href=\"#orderby\">orderBy<\/a><\/li>\n<li><a href=\"#distinct\">distinct<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#%D0%B2%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D1%8B\">\u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/a><\/li>\n<li><a href=\"#%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%8B-%D0%B8-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B\">\u0424\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b<\/a><br \/> \n<ul>\n<li><a href=\"#%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%8B\">\u0424\u0438\u043b\u044c\u0442\u0440\u044b<\/a><\/li>\n<li><a href=\"#%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B\">\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%81%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9\">\u0424\u0438\u043b\u044c\u0442\u0440\u044b \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/a><\/li>\n<li><a href=\"#%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0\">\u041c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/a><\/li>\n<li><a href=\"#%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B8\">\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/a><br \/> \n<ul>\n<li><a href=\"#transaction\">$transaction<\/a><\/li>\n<li><a href=\"#%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5-%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B8\">\u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/654341\/\">\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h1 id=\"klient\">\u041a\u043b\u0438\u0435\u043d\u0442<\/h1>\n<p>  <\/p>\n<h2 id=\"nastroyki\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/h2>\n<p>  <\/p>\n<h3 id=\"select\">select<\/h3>\n<p>  <\/p>\n<p><code>select<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const user = await prisma.user.findUnique({   where: { email },   select: {     id: true,     email: true,     first_name: true,     last_name: true,     age: true   } })  \/\/ or const usersWithPosts = await prisma.user.findMany({   select: {     id: true,     email: true,     posts: {       select: {         id: true,         title: true,         content: true,         author_id: true,         created_at: true       }     }   } })  \/\/ or const usersWithPostsAndComments = await prisma.user.findMany({   select: {     id: true,     email: true,     posts: {       include: {         comments: true       }     }   } })<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"include\">include<\/h3>\n<p>  <\/p>\n<p><code>include<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f (\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438) \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const userWithPostsAndComments = await prisma.user.findUnique({   where: { email },   include: {     posts: true,     comments: true   } })<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"where\">where<\/h3>\n<p>  <\/p>\n<p><code>where<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0444\u0438\u043b\u044c\u0442\u0440 (\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0445 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e), \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const admins = await prisma.user.findMany({   where: {     email: {       contains: 'admin'     }   } })<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"orderby\">orderBy<\/h3>\n<p>  <\/p>\n<p><code>orderBy<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044f \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 <code>orderBy<\/code> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <code>asc<\/code> \u0438 <code>desc<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const usersByPostCount = await prisma.user.findMany({   orderBy: {     posts: {       count: 'desc'     }   } })<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"distinct\">distinct<\/h3>\n<p>  <\/p>\n<p><code>distinct<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const distinctCities = await prisma.user.findMany({   select: {     city: true,     country: true   },   distinct: ['city'] })<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"vlozhennye-zaprosy\">\u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/h2>\n<p>  <\/p>\n<ul>\n<li><code>create: { data } | [{ data1 }, { data2 }, ...{ dataN }]<\/code> \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u043b\u0438 \u043d\u0430\u0431\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c. <code>create<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 (<code>create<\/code>) \u043d\u043e\u0432\u043e\u0439 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 (<code>update<\/code>) \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const user = await prisma.user.create({   data: {     email,     profile: {       \/\/ \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441       create: {         first_name,         last_name       }     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>createMany: [{ data1 }, { data2 }, ...{ dataN }]<\/code> \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u043d\u043e\u0432\u044b\u0445 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c. <code>createMany<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 (<code>create<\/code>) \u043d\u043e\u0432\u043e\u0439 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 (<code>update<\/code>) \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const userWithPosts = await prisma.user.create({   data: {     email,     posts: {       \/\/ !       createMany: {         data: posts       }     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>update: { data } | [{ data1 }, { data2 }, ...{ dataN }]<\/code> \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const user = await prisma.user.update({   where: { email },   data: {     profile: {       \/\/ !       update: { age }     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>updateMany: { data } | [{ data1 }, { data2 }, ...{ dataN }]<\/code> \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const result = await prisma.user.update({   where: { id },   data: {     posts: {       \/\/ !       updateMany: {         where: {           published: false         },         data: {           like_count: 0         }       }     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>upsert: { data } | [{ data1 }, { data2 }, ...{ dataN }]<\/code> \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const user = await prisma.user.update({   where: { email },   data: {     profile: {       \/\/ !       upsert: {         create: { age },         update: { age }       }     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>delete: boolean | { data } | [{ data1 }, { data2 }, ...{ dataN }]<\/code> \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c. \u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const user = await prisma.user.update({   where: { email },   data: {     profile: {       delete: true     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>deleteMany: { data } | [{ data1 }, { data2 }, ...{ dataN }]<\/code> \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const user = await prisma.user.update({   where: { id },   data: {     age,     posts: {       \/\/ !       deleteMany: {}     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>set: { data } | [{ data1 }, { data2 }, ...{ dataN }]<\/code> \u2014 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const userWithPosts = await prisma.user.update({   where: { email },   data: {     posts: {       \/\/ !       set: newPosts     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>connect<\/code> \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443 \u0438\u043b\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044e<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const user = await prisma.post.create({   data: {     title,     content,     author: {       connect: { email }     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>connectOrCreate<\/code> \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443 \u0438\u043b\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044e \u043b\u0438\u0431\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0439;<\/li>\n<li><code>disconnect<\/code> \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0431\u0435\u0437 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439. <code>disconnect<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"filtry-i-operatory\">\u0424\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b<\/h2>\n<p>  <\/p>\n<h3 id=\"filtry\">\u0424\u0438\u043b\u044c\u0442\u0440\u044b<\/h3>\n<p>  <\/p>\n<ul>\n<li><code>equals<\/code> \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f <code>n<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const usersWithNameHarry = await prisma.user.findMany({   where: {     name: {       equals: 'Harry'     }   } })  \/\/ `equals` \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0443\u0449\u0435\u043d\u043e const usersWithNameHarry = await prisma.user.findMany({   where: {     name: 'Harry'   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>not<\/code> \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f <code>n<\/code>;<\/li>\n<li><code>in<\/code> \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>n<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 (\u043c\u0430\u0441\u0441\u0438\u0432\u0435)<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const usersWithNameAliceOrBob = await prisma.user.findMany({   where: {     user_name: {       \/\/ !       in: ['Alice', 'Bob']     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>notIn<\/code> \u2014 <code>n<\/code> \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435;<\/li>\n<li><code>lt<\/code> \u2014 <code>n<\/code> \u043c\u0435\u043d\u044c\u0448\u0435 <code>x<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const notPopularPosts = await prisma.post.findMany({   where: {     likeCount: {       lt: 100     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>lte<\/code> \u2014 <code>n<\/code> \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u043e <code>x<\/code>;<\/li>\n<li><code>gt<\/code> \u2014 <code>n<\/code> \u0431\u043e\u043b\u044c\u0448\u0435 <code>x<\/code>;<\/li>\n<li><code>gte<\/code> \u2014 <code>n<\/code> \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u043e <code>x<\/code>;<\/li>\n<li><code>contains<\/code> \u2014 <code>n<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <code>x<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const admins = await prisma.user.findMany({   where: {     email: {       contains: 'admin'     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>startsWith<\/code> \u2014 <code>n<\/code> \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 <code>x<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const usersWithNameStartsWithA = await prisma.user.findMany({   where: {     user_name: {       startsWith: 'A'     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>endsWith<\/code> \u2014 <code>n<\/code> \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f <code>x<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"operatory\">\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b<\/h3>\n<p>  <\/p>\n<ul>\n<li><code>AND<\/code> \u2014 \u0432\u0441\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c <code>true<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const notPublishedPostsAboutTypeScript = await prisma.post.findMany({   where: {     AND: [       {         title: {           contains: 'TypeScript'         }       },       {         published: false       }     ]   } })<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044f (\u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043f\u043e\u043b\u044f), \u0430 \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e\u0441\u043b\u0435 (\u0432\u043d\u0443\u0442\u0440\u0438).<\/p>\n<p>  <\/p>\n<ul>\n<li><code>OR<\/code> \u2014 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c <code>true<\/code>;<\/li>\n<li><code>NOT<\/code> \u2014 \u0432\u0441\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c <code>false<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"filtry-dlya-svyazannyh-zapisey\">\u0424\u0438\u043b\u044c\u0442\u0440\u044b \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/h2>\n<p>  <\/p>\n<ul>\n<li><code>some<\/code> \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const usersWithPostsAboutTypeScript = await prisma.user.findMany({   where: {     posts: {       some: {         title: {           contains: 'TypeScript'         }       }     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>every<\/code> \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u0441\u0435\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c;<\/li>\n<li><code>none<\/code> \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043d\u0438 \u043e\u0434\u043d\u043e\u043c\u0443 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044e;<\/li>\n<li><code>is<\/code> \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044e;<\/li>\n<li><code>notIs<\/code> \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044e.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"metody-klienta\">\u041c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/h2>\n<p>  <\/p>\n<ul>\n<li><code>$disconnect<\/code> \u2014 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0411\u0414, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <code>$connect<\/code> (\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u043e), \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0434\u0432\u0438\u0436\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (query engine) <code>Prisma<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">import { PrismaClient } from '@prisma\/client'  const prisma = new PrismaClient()  async function seedDb() {   try {     await prisma.model.create(data)   } catch (e) {     onError(e)   } finally {     \/\/ !     await prisma.$disconnect()   } }<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>$use<\/code> \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u0430 (middleware)<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">prisma.$use(async (params, next) => {   console.log('\u042d\u0442\u043e \u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a')    \/\/ \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 `params`    return next(params) })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>next<\/code> \u2014 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 &#171;\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c&#187; \u0432 \u0441\u0442\u0435\u043a\u0435 \u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u043e\u0432. \u0422\u0430\u043a\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a \u0438\u043b\u0438 \u0434\u0432\u0438\u0436\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 <code>Prisma<\/code>;<\/li>\n<li><code>params<\/code> \u2014 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438:<br \/> \n<ul>\n<li><code>action<\/code> \u2014 \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>create<\/code> \u0438\u043b\u0438 <code>findMany<\/code>;<\/li>\n<li><code>args<\/code> \u2014 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>where<\/code> \u0438\u043b\u0438 <code>data<\/code>;<\/li>\n<li><code>model<\/code> \u2014 \u043c\u043e\u0434\u0435\u043b\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>User<\/code> \u0438\u043b\u0438 <code>Post<\/code>;<\/li>\n<li><code>runInTransaction<\/code> \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>true<\/code>, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<ul>\n<li>\u043c\u0435\u0442\u043e\u0434\u044b <code>$queryRaw<\/code>, <code>$executeRaw<\/code> \u0438 <code>$runCommandRaw<\/code> \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <code>SQL<\/code>. \u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/www.prisma.io\/docs\/concepts\/components\/prisma-client\/raw-database-access\">\u0437\u0434\u0435\u0441\u044c<\/a>;<\/li>\n<li><code>$transaction<\/code> \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 (\u0441\u043c. \u043d\u0438\u0436\u0435).<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.prisma.io\/docs\/reference\/api-reference\/prisma-schema-reference\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<h2 id=\"tranzakcii\">\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/h2>\n<p>  <\/p>\n<p>\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435, \u0442.\u0435. \u043b\u0438\u0431\u043e \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u043b\u0438\u0431\u043e \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u044e\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<p>  <\/p>\n<p><code>Prisma<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0442\u0440\u0435\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b (\u0441\u043c. \u0432\u044b\u0448\u0435): \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const newUserWithProfile = await prisma.user.create({   data: {     email,     profile: {       \/\/ !       create: {         first_name,         last_name       }     }   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li>\u043f\u0430\u043a\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\/\u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0435 (batch\/bulk) \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u0430\u043a <code>createMany<\/code>, <code>updateMany<\/code> \u0438 <code>deleteMany<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const removedUser = await prisma.user.delete({   where: {     email   } })  \/\/ ! await prisma.post.deleteMany({   where: {     author_id: removedUser.id   } })<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li>\u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <code>$transaction<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"transaction\">$transaction<\/h3>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>$transaction<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0432 \u0434\u0432\u0443\u0445 \u0444\u043e\u0440\u043c\u0430\u0445:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>$transaction([ query1, query2, ...queryN ])<\/code> \u2014 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432;<\/li>\n<li><code>$transaction(fn)<\/code> \u2014 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0434.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0441\u0442\u044b, \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0432\u043e <code>TypeScript<\/code> \u0438 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0441\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const [postsAboutTypeScript, totalPostCount] = await prisma.$transaction([   prisma.post.findMany({ where: { title: { contains: 'TypeScript' } } }),   prisma.post.count() ])<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 <code>$transaction<\/code> \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>SQL<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const [userNames, updatedUser] = await prisma.$transaction([   prisma.$queryRaw`SELECT 'user_name' FROM users`,   prisma.$executeRaw`UPDATE users SET user_name = 'Harry' WHERE id = 42` ])<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"interaktivnye-tranzakcii\">\u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/h3>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u0412 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">generator client {   provider        = \"prisma-client-js\"   previewFeatures = [\"interactiveTransactions\"] }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0435\u0436\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0443 <code>Alice<\/code> \u0438 <code>Bob<\/code> \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u043e <code>100$<\/code> \u043d\u0430 \u0441\u0447\u0435\u0442\u0430\u0445 (account), \u0438 <code>Alice<\/code> \u0445\u043e\u0447\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c <code>Bob<\/code> \u0441\u0432\u043e\u0438 <code>100$<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">import { PrismaClient } from '@prisma\/client' const prisma = new PrismaClient()  async function transfer(from, to, amount) {   try {     await prisma.$transaction(async (prisma) => {       \/\/ 1. \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0431\u0430\u043b\u0430\u043d\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f       const sender = await prisma.account.update({         data: {           balance: {             decrement: amount           }         },         where: {           email: from         }       })        \/\/ 2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0431\u0430\u043b\u0430\u043d\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f >= 0       if (sender.balance &lt; 0) {         throw new Error(`${from} \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 ${amount}`)       }        \/\/ 3. \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0431\u0430\u043b\u0430\u043d\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f       const recipient = await prisma.account.update({         data: {           balance: {             increment: amount           }         },         where: {           email: to         }       })        return recipient     })   } catch(e) {     \/\/ \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443   } }  async function main() {   \/\/ \u044d\u0442\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0441\u044f   await transfer('alice@mail.com', 'bob@mail.com', 100)   \/\/ \u0430 \u044d\u0442\u0430 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0442\u0441\u044f   await transfer('alice@mail.com', 'bob@mail.com', 100) }  main().finally(() => {   prisma.$disconnect() })<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.prisma.io\/docs\/concepts\/components\/prisma-client\/transactions\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u044d\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u043c \u043e <code>Prisma<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 happy coding!<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<p><a href=\"https:\/\/cloud.timeweb.com\/vds-promo-1-rub?utm_source=habr&amp;utm_medium=banner&amp;utm_campaign=vds-promo-1-rub\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/st\/f9\/ui\/stf9uiznc_h9q5qyjl2fw7sx0m0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/st\/f9\/ui\/stf9uiznc_h9q5qyjl2fw7sx0m0.png\"\/><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/654567\/\"> https:\/\/habr.com\/ru\/company\/timeweb\/blog\/654567\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ax\/ev\/zk\/axevzkfcmhrfdfb4j8j9hg12xj0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ax\/ev\/zk\/axevzkfcmhrfdfb4j8j9hg12xj0.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f!<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0438\u0437 2 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c\u0438 \u043e <a href=\"https:\/\/www.prisma.io\/\"><code>Prisma<\/code><\/a>.<\/p>\n<p>  <\/p>\n<p><code>Prisma<\/code> \u2014 \u044d\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 (\u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0435) <a href=\"https:\/\/ru.wikipedia.org\/wiki\/ORM\">\u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/a> (Object-Relational Mapping, ORM) \u0434\u043b\u044f <code>Node.js<\/code> \u0438 <code>TypeScript<\/code>. \u041f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, <code>Prisma<\/code> \u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 (<code>PostgreSQL<\/code>, <code>MySQL<\/code>, <code>SQL Server<\/code>, <code>SQLite<\/code>) \u0438 \u043d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 (<code>MongoDB<\/code>) \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>JavaScript<\/code> \u0438\u043b\u0438 <code>TypeScript<\/code> \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/SQL\"><code>SQL<\/code><\/a> (\u0445\u043e\u0442\u044f \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u0435\u0442\u0441\u044f).<\/p>\n<p>  <\/p>\n<h2 id=\"soderzhanie-etoy-chasti\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"#%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/a><br \/> \n<ul>\n<li><a href=\"#select\">select<\/a><\/li>\n<li><a href=\"#include\">include<\/a><\/li>\n<li><a href=\"#where\">where<\/a><\/li>\n<li><a href=\"#orderby\">orderBy<\/a><\/li>\n<li><a href=\"#distinct\">distinct<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#%D0%B2%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D1%8B\">\u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/a><\/li>\n<li><a href=\"#%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%8B-%D0%B8-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B\">\u0424\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b<\/a><br \/> \n<ul>\n<li><a href=\"#%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%8B\">\u0424\u0438\u043b\u044c\u0442\u0440\u044b<\/a><\/li>\n<li><a href=\"#%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B\">\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%81%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9\">\u0424\u0438\u043b\u044c\u0442\u0440\u044b \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/a><\/li>\n<li><a href=\"#%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0\">\u041c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/a><\/li>\n<li><a href=\"#%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B8\">\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/a><br \/> \n<ul>\n<li><a href=\"#transaction\">$transaction<\/a><\/li>\n<li><a href=\"#%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5-%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B8\">\u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/654341\/\">\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-330371","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/330371","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=330371"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/330371\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=330371"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=330371"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=330371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}