<!DOCTYPE html>
    <html lang="vi" xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://ogp.me/ns#">
    <head>
<title>Cách kết nối PostgreSQL với ứng dụng Next.js bằng Prisma</title>
<meta name="description" content="Cách kết nối PostgreSQL với ứng dụng Next.js bằng Prisma - Savefile - Tin Tức -...">
<meta name="author" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :.">
<meta name="copyright" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :. [admin@nguoicodonvn2008.info]">
<meta name="robots" content="index, archive, follow, noodp">
<meta name="googlebot" content="index,archive,follow,noodp">
<meta name="msnbot" content="all,index,follow">
<meta name="generator" content="NukeViet v4.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta property="og:title" content="Cách kết nối PostgreSQL với ứng dụng Next.js bằng Prisma">
<meta property="og:type" content="website">
<meta property="og:description" content="Savefile - Tin Tức - https&#x3A;&#x002F;&#x002F;www.nguoicodonvn2008.info&#x002F;vi&#x002F;news&#x002F;savefile&#x002F;kien-thuc-may-tinh&#x002F;cach-ket-noi-postgresql-voi-ung-dung-next-js-bang-prisma-6824.html">
<meta property="og:site_name" content=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.">
<meta property="og:url" content="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-ket-noi-postgresql-voi-ung-dung-next-js-bang-prisma-6824.html">
<link rel="shortcut icon" href="https://www.nguoicodonvn2008.info/favicon.ico">
<link rel="canonical" href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-ket-noi-postgresql-voi-ung-dung-next-js-bang-prisma-6824.html">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/" title="Tin Tức" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/karaoke-dual/" title="Tin Tức - Karaoke Dual" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/nhac-tre/" title="Tin Tức - Nhạc trẻ" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tru-tinh/" title="Tin Tức - Trữ tình" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/nuoc-ngoai/" title="Tin Tức - Nước ngoài" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/remix/" title="Tin Tức - Remix" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tam-su-tinh-yeu/" title="Tin Tức - Tâm sự tình yêu" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tho-suu-tam/" title="Tin Tức - Thơ sưu tầm" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/cuoc-song/" title="Tin Tức - Cuộc sống" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/phan-mem/" title="Tin Tức - Phần mềm" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/kien-thuc-may-tinh/" title="Tin Tức - Kiến thức máy tính" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/hoc-tap/" title="Tin Tức - Học tập" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tai-lieu/" title="Tin Tức - Tài liệu" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/de-thi/" title="Tin Tức - Đề thi" type="application/rss+xml">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/assets/css/font-awesome.min.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/style.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/style.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/news.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/custom.css" type="text/css">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/jquery/jquery.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/language/vi.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/global.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/site.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/news.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/main.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/custom.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/bootstrap.min.js" type="text/javascript">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/assets/css/font-awesome.min.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/style.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/style.non-responsive.css">
<link rel="StyleSheet" href="https://www.nguoicodonvn2008.info/themes/default/css/news.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/custom.css">
<style type="text/css">
	body{background: #fff;}
</style>
    </head>
    <body>
<div id="print">
	<div id="hd_print">
		<h2 class="pull-left">.&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.</h2>
		<p class="pull-right"><a title=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;." href="https://www.nguoicodonvn2008.info/">https://www.nguoicodonvn2008.info</a></p>
	</div>
	<div class="clear"></div>
	<hr />
	<div id="content">
		<h1>Cách kết nối PostgreSQL với ứng dụng Next.js bằng Prisma</h1>
		<ul class="list-inline">
			<li>Thứ tư - 01/03/2023 23:51</li>
			<li class="hidden-print txtrequired"><em class="fa fa-print">&nbsp;</em><a title="In ra" href="javascript:;" onclick="window.print()">In ra</a></li>
			<li class="hidden-print txtrequired"><em class="fa fa-power-off">&nbsp;</em><a title="Đóng cửa sổ này" href="javascript:;" onclick="window.close()">Đóng cửa sổ này</a></li>
		</ul>
		<div class="clear"></div>
		<div id="hometext">
		</div>
				<div class="imghome">
			<img alt="Cách kết nối PostgreSQL với ứng dụng Next.js bằng Prisma" src="https://st.quantrimang.com/photos/image/2023/03/02/prisma-nextjs-app-7.jpg" width="460" class="img-thumbnail" />
		</div>
		<div class="clear"></div>
		<div id="bodytext" class="clearfix">
			<p style="text-align: justify;"><strong>Truy cập database Postgres</strong>&nbsp;từ app Next bằng ORM thế hệ mới này rất đơn giản. Dưới đây là hướng dẫn chi tiết.</p>

<p style="text-align: justify;"><img alt="Cách dùng Prisma" data-i="0" data-src="https://st.quantrimang.com/photos/image/2023/03/02/prisma-nextjs-app-7.jpg" data-was-processed="true" height="340" src="https://st.quantrimang.com/photos/image/2023/03/02/prisma-nextjs-app-7.jpg" width="650" /></p>

<p style="text-align: justify;"><strong>Tương tác với database PostgreSQL</strong>&nbsp;hay bất kỳ cơ sở dữ liệu nào khác trực tiếp tăng số lượng SQL bạn viết. Điều này có thể gây ra các vấn đề bảo mật như tấn công SQL injection và hạn chế tính di động của cơ sở dữ liệu. Bạn nên dùng một ORM (Object Relation Mapper) như Prisma để cung cấp một lớp trừu tượng trên database.</p>

<p style="text-align: justify;">Học&nbsp;<strong>cách dùng Prisma trong Next.js để kết nối và tương tác với database PostgreSQL</strong>.</p>

<h2 style="text-align: justify;">Tạo ứng dụng Next.js</h2>

<p style="text-align: justify;">Tạo một app Next.js tên prisma-next bằng cách chạy lệnh này trong terminal của bạn:</p>

<pre id="pre0" style="text-align: justify;">
npx create-next-app prisma-next</pre>

<p style="text-align: justify;">Hành động này sẽ tạo một thư mụ mới tên prisma-next với các file cơ bản để bắt đầu. Điều hướng tới thư mục prisma-next và khởi động server lập trình bằng lệnh này:</p>

<pre id="pre1" style="text-align: justify;">
npm run dev</pre>

<p style="text-align: justify;">Hành động này sẽ khởi động một server lập trình tại http://localhost:3000.</p>

<h2 style="text-align: justify;">Cài đặt client Prisma</h2>

<p style="text-align: justify;">Để bắt đầu bằng Prisma, bạn sẽ cần prisma và các gói @prisma/client. Prisma là công cụ Prisma CLI còn @prisma/client là một trình xây dựng truy vấn tự động tạo, sẽ giúp bạn truy vấn database.</p>

<p style="text-align: justify;">Cài đặt hai gói này qua npm.</p>

<pre id="pre2">
<code>npm install prisma @prisma/client</code></pre>

<p style="text-align: justify;">Tiếp theo, khởi tạo prisma bằng cách chạy lệnh npx prisma init trên terminal.</p>

<pre id="pre3">
<code>npx prisma init</code></pre>

<p style="text-align: justify;">Hành động trên tạo một file mới, tên&nbsp;<strong>schema.prisma</strong>. Nó chứa sơ đồ database và file&nbsp;<strong>.env</strong>&nbsp;cho bạn thêm URL kết nối cơ sở dữ liệu.</p>

<h2 style="text-align: justify;">Thêm URL kết nối</h2>

<p style="text-align: justify;">Bạn cần một URL kết nối để liên kết prisma với database PostgreSQL. Định dạng chung cho URL kết nối này là:</p>

<pre id="pre4">
<code>postgres://{username}:{password}@{hostname}:{port}/{database-name}</code></pre>

<p style="text-align: justify;">Thay các thành phần trong dấu ngoặc nhọn bằng các thông tin database của bạn, sau đó lưu nó vào file .env:</p>

<pre id="pre5">
<code>DATABASE_URL = &amp;rdquo;your connection string&amp;rdquo;</code></pre>

<p style="text-align: justify;">Tiếp theo, ở schema.prisma, xác định URL kết nối database:</p>

<pre id="pre6">
<code>datasource db {
  provider = &quot;PostgreSQL&quot;
  url = env(&quot;DATABASE_URL&quot;)
}</code></pre>

<h2 style="text-align: justify;">Xác định Database Schema</h2>

<p style="text-align: justify;">Database Schema hay lược đồ cơ sở dữ liệu là một cấu trúc định nghĩa mô hình dữ liệu của database. Nó xác định bảng, cột và các mối liên hệ giữa các bảng trong database cùng mọi ràng buộc và chỉ mục database nên sử dụng.</p>

<p style="text-align: justify;">Để tạo một sơ đồ cho database cùng một bảng người dùng, mở file schema.prisma, rồi thêm modal User.</p>

<pre id="pre7">
<code>model User {
  id String @default(cuid()) @id
  name String?
  email String @unique
}</code></pre>

<p style="text-align: justify;">Model User có một cột ID là khóa chính, một cột tên chuỗi kiểu và một cột email độc đáo.</p>

<p style="text-align: justify;">Sau khi xác định mẫu dữ liệu, bạn cần triển khai sơ đồ cho database bằng lệnh npx prisma db push.</p>

<pre id="pre8">
<code>npx prisma db push</code></pre>

<p style="text-align: justify;">Lệnh này tạo các bảng thực tế trong database.</p>

<h2 style="text-align: justify;">Dùng Prisma trong Next.js</h2>

<p style="text-align: justify;">Để dùng Prisma trong Next.js, bạn cần tạo một phiên bản client prisma.</p>

<p style="text-align: justify;">Đầu tiên, tạo client Prisma.</p>

<pre id="pre9">
<code>npx prisma generate</code></pre>

<p style="text-align: justify;">Sau đó, tạo một thư mục mới mang tên lib và thêm một file mới tên prisma.js bên trong nó. Ở file này, thêm code sau để tạo một phiên bản client prisma.</p>

<pre id="pre10" style="text-align: justify;">
import { PrismaClient } from &quot;@prisma/client&quot;;
let prisma;

if (typeof window === &quot;undefined&quot;) {
    if (process.env.NODE_ENV === &quot;production&quot;) {
        prisma = new PrismaClient();
    } else {
        if (!global.prisma) {
            global.prisma = new PrismaClient();
        }

        prisma = global.prisma;
    }
}

export default prisma;</pre>

<p style="text-align: justify;">Giờ, bạn có thể nhập client prisma là “prisma” vào trong file, rồi bắt đầu truy vấn database.</p>

<h2 style="text-align: justify;">Truy vấn database trong Next.js API Route</h2>

<p style="text-align: justify;">Prisma thường được dùng ở bên server. Tại đây, nó có thể an toàn tương tác với databse. Trong ứng dụng Next.js, bạn có thể thiết lập một tuyến API dùng Prisma để tìm nạp dữ liệu từ database và trả nó về client. Các trang hay thành phần sau đó có thể tìm nạo dữ liệu từ tuyến API bằng một thư viện HTTP như Axios hoặc fetch.</p>

<p style="text-align: justify;">Tạo tuyến API bằng cách mở thư mục pages/api và tạo một thư mục phụ tên db. Ở thư mục này, tạo file<strong>&nbsp;createuser.js&nbsp;</strong>và thêm hàm handler sau:</p>

<pre id="pre11" style="text-align: justify;">
import prisma from &quot;@/lib/prisma&quot;;

export default async function handler(req, res) {
    const { name, email } = req.query;

    try {
        const newUer = await prisma.User.create({
            data: {
                name,
                email,
            },
        });

        res.json({ user: newUer, error: null });
    } catch (error) {
        res.json({ error: error.message, user: null });
    }
}</pre>

<p style="text-align: justify;">Hàm này lấy tên và email từ phần request. Sau đó, ở khối try/catch, nó dùng phương thức tạo do Prisma Client cung cấp để tạo một người dùng mới. Hàm này trả về một đối tượng JSON chứa người dùng và thông báo lỗi nếu có.</p>

<p style="text-align: justify;">Ở một trong số các thành phần, giờ bạn có thể đưa ra yêu cầu với tuyến API này. Ví dụ, tạo một thư mục mới tên profile trong danh mục app và thêm một file<strong>&nbsp;page.js</strong>&nbsp;mới. Sau đó, bổ sung một biểu mẫu đơn giản, chứa hai box nhập cho tên &amp; email cùng một nút gửi (summit).</p>

<p style="text-align: justify;">Trên form, thêm một sự kiện&nbsp;<strong>on-submit&nbsp;</strong>mà gọi hàm&nbsp;<strong>handleSubmit</strong>. Cụ thể code ở đây như sau:</p>

<pre id="pre12" style="text-align: justify;">
&quot;use client&quot;;
import React, { useState } from &quot;react&quot;;

export default function Page() {
    const &#91;name, setname&#93; = useState(&quot;&quot;);
    const &#91;email, setemail&#93; = useState(&quot;&quot;);

    const handleSubmit = async (e) =&gt; {
        e.preventDefault();
    };

    return (
        &lt;form onSubmit={handleSubmit}&gt;
            &lt;input
                type={text}
                placeholder=&quot;Add name&quot;
                value={name}
                onChange={setname((e) =&gt; e.target.value)}
            /&gt;

            &lt;input
                type={text}
                placeholder=&quot;Add email&quot;
                value={email}
                onChange={setemail((e) =&gt; e.target.value)}
            /&gt;

            &lt;button type=&quot;submit&quot;&gt;Submit&lt;/button&gt;
        &lt;/form&gt;
    );
}</pre>

<p style="text-align: justify;">Trong hàm handleSubmit, dùng fetch để gửi yêu cầu tới tuyến /api/db/createuser.</p>

<pre id="pre13" style="text-align: justify;">
const handleSubmit = async (e) =&gt; {
    e.preventDefault();

    const user = await fetch(&quot;/api/db/createuser&quot;, {
        ContentType: &quot;application/json&quot;,
        body: JSON.stringify({ name, email }),
    });
};</pre>

<p style="text-align: justify;">Giờ khi biểu mẫu được gửi đi, Prisma sẽ tạo một bản ghi người dùng mới trong bảng User.</p>

<p style="text-align: justify;">Trên đây<strong>&nbsp;cách dùng Prisma để kết nối và truy vấn database PostgreSQL từ app Next.js</strong>. Hi vọng bài viết hữu ích với các bạn.</p>
		</div>
				<div id="author">
						<p>
				<strong>Nguồn tin:</strong>
				Quantrimang.com
			</p>
		</div>
	</div>
	<div id="footer" class="clearfix">
		<div id="url">
			<strong>URL của bản tin này: </strong><a href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-ket-noi-postgresql-voi-ung-dung-next-js-bang-prisma-6824.html" title="Cách kết nối PostgreSQL với ứng dụng Next.js bằng Prisma">https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-ket-noi-postgresql-voi-ung-dung-next-js-bang-prisma-6824.html</a>

		</div>
		<div class="clear"></div>
		<div class="copyright">
			&copy; .&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.
		</div>
		<div id="contact">
			<a href="mailto:admin@nguoicodonvn2008.info">admin@nguoicodonvn2008.info</a>
		</div>
	</div>
</div>
        <div id="timeoutsess" class="chromeframe">
            Bạn đã không sử dụng Site, <a onclick="timeoutsesscancel();" href="https://www.nguoicodonvn2008.info/#">Bấm vào đây để duy trì trạng thái đăng nhập</a>. Thời gian chờ: <span id="secField"> 60 </span> giây
        </div>
        <div id="openidResult" class="nv-alert" style="display:none"></div>
        <div id="openidBt" data-result="" data-redirect=""></div>
		</script>
		<div class="car-top">
  <span><img src="https://www.nguoicodonvn2008.info/themes/default/images/car.png" alt=""></span>
</div>
<script src="https://www.nguoicodonvn2008.info/assets/js/jquery/jquery.min.js"></script>
<script>var nv_base_siteurl="/",nv_lang_data="vi",nv_lang_interface="vi",nv_name_variable="nv",nv_fc_variable="op",nv_lang_variable="language",nv_module_name="news",nv_func_name="savefile",nv_is_user=0, nv_my_ofs=-4,nv_my_abbr="EDT",nv_cookie_prefix="nv4c_e856T",nv_check_pass_mstime=1738000,nv_area_admin=0,nv_safemode=0,theme_responsive=0,nv_recaptcha_ver=2,nv_recaptcha_sitekey="",nv_recaptcha_type="image",XSSsanitize=1;</script>
<script src="https://www.nguoicodonvn2008.info/assets/js/language/vi.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/global.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/site.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/news.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/main.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/custom.js"></script>
<script type="application/ld+json">
        {
            "@context": "https://schema.org",
            "@type": "Organization",
            "url": "https://www.nguoicodonvn2008.info",
            "logo": "https://www.nguoicodonvn2008.info/uploads/angel.gif"
        }
        </script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/bootstrap.min.js"></script>
<script type="text/javascript">
var $scrolltop = $('.car-top');
$scrolltop.on('click', function () {
    $('html,body').animate({
        scrollTop: 0
    }, 800);
    $(this).addClass("car-run");
    setTimeout(function(){ $scrolltop.removeClass('car-run');}, 1000);
    return false;
});
$(window).on('scroll', function ()
{ 
    if($(window).scrollTop() >= 200)
    {
        $scrolltop.addClass("show");
        $scrolltop.addClass("car-down");
    }
    else
    {
       $scrolltop.removeClass("show");
       setTimeout(function(){ $scrolltop.removeClass('car-down');}, 300);
    }
});
</script>
</body>
</html>