在Postgres和Node.js中使用Prisma
大多数现代的应用程序主要利用数据库来存储数据。在许多现代的后端架构中,我们围绕着数据及其操作建立其他一切模型。
当使用Node.js时,大多数开发者选择使用NoSql数据库,因为它们被认为更容易使用。这方面的例子有Mongodb和Firebase。
在Node.js中使用SQL数据库通常需要ORM(对象关系映射)库来抽象出不整齐的数据库操作,所以开发者只需要担心逻辑问题。
在这篇文章中,我们将看看如何设置和创建一个简单的Node.js API,使用Express作为我们选择的框架,Postgresql作为我们的数据库,以及Prisma作为我们的ORM。
前提条件
要轻松地跟随本文,你需要具备以下条件。
- 在你的机器上安装Node.js。
- 在你的机器上安装Postgresql。
- 对Express框架有良好的理解。
- 对postgress有一定的了解。
第1步:设置应用程序
创建你的工作目录,并给它起一个你喜欢的名字。我将把我的目录称为section-prisma 。这就是所有魔法发生的地方。
在该目录中运行npm init -y ,初始化一个Node.js项目。
mkdir section-prisma
cd section-prisma
npm init -y
完成这些后,我们现在可以安装Prisma了。
要做到这一点,我们使用npm或yarn。
npm install prisma
下一步是将prisma初始化到项目中。
在终端,我们运行。
npx prisma init
这个命令将在你的项目根部创建一个文件夹,名为prisma 。
在这个文件夹中,有一个名为schema.prisma 的文件。这个文件将包含我们在这个项目中对prisma的配置。该命令还创建了一个.env 文件。
.env 文件通常用于存储你不希望公开的敏感值,如密钥和秘密令牌,甚至是加密秘密。最好的做法是在你的.gitignore 文件中添加它。
第2步:连接到Postgres
本文已经假设你的机器上已经设置了Postgress,我们将不去讨论这个问题。
Prisma支持许多数据库,而postgress只是其中之一。如果你想使用另一个数据库,如sqlite,你可以在schema.prisma 文件的datasource选项中改变数据库提供者的值。
由于我们使用的是postgres,我们的schema.prisma文件将看起来像这样。
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
现在在.env文件中,我们将添加我们的数据库URL。
对于postgress,它通常看起来像这样。
DATABASE_URL="postgresql://your-user:your-password@localhost:5432/db-name?schema=public"
将your_user,your_password 和db_name 替换成你正确的凭证。
完成这些后,我们就有了我们的项目设置。
让我们开始编码吧!
第3步:使用Prisma进行数据建模
在使用数据库时,你必须定义数据库中的数据是什么样子的。为了描述客户提供的数据和数据库期待的数据,建模是必要的。
Prisma自带的data modeling language ,使其更容易进行数据建模。
Prisma是一个ORM,所以它必须将数据模型转化为相关的SQL语句和数据库表格。因此,一旦我们完成了我们的模型,我们将运行prisma migrate ,它将在db中创建相关的表。
第4步:创建我们的模型
在schema.prisma 文件中,在数据源和生成器块之后,我们可以定义我们的模型。
提示:如果你在本教程中使用VSCode,你可以在这里安装prisma扩展,以帮助你自动完成和格式化prisma建模语言。
为了定义一个模型,我们使用关键字model ,然后指定模型的名称。这整个模型将被数据库视为一个表。
model Job { }
我们现在可以在我们的模型中添加字段。Prisma模型使用普通模型中使用的相同的数据库基元和类型。
在这篇文章中,我们将只使用一个模型进行演示。
在Job model ,让我们定义我们的字段。
model Job {
id Int @id @default(autoincrement())
title String
location String
salary String
}
我们定义了title,location 和salary 字段,它们都是字符串类型。我们还有一个id ,这样每个Job就可以是唯一的。
在prisma中,我们可以定义attributes ,比如@id ,表示这个字段将被视为一个id,@default() ,设置字段的默认值。
有些属性采取的参数与default 采取的参数autoincrement() 的方式相似。
就这样,你已经建立了你的第一个Prisma模型。
我们现在应该通过运行以下命令将其与我们的数据库同步。
npx prisma migrate dev
该命令会提示你输入迁移的名称,所以你应该非常谨慎地提供数据。
一旦命令完成,你应该在Prisma文件夹中看到一个migrations ,其中包含我们刚刚迁移到数据库中的数据。
第5步:创建一个Rest API
我们现在可以查询数据库,同时围绕我们的数据创建一个Express API。
创建一个Express服务器
第一步,让我们使用Express创建我们的服务器。
要安装express,请运行。
npm i express
在文件夹的根部,创建一个名为index.js 的文件,这就是所有魔法将发生的地方。
在该文件中,我们将创建一个简单的服务器。
const express = require("express");
const app = express();
app.use(express.json());
const port = process.env.PORT || "3000";
app.listen(port, () => {
console.log(`Server Running at ${port} 🚀`);
});
Prisma的主要功能之一是查询和查询关系。
它提供了一些查询选项,帮助你完成CRUD操作和其他操作。我们将在我们的例子中使用一些选项。
我们可以创建一个路由来创建工作。它将是一个post请求,期望有一个包含job对象的body。
...
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
...
app.post('/job', async (req, res) => {
const job = await prisma.job.create({ data: req.body });
res.json(job);
});
在上面的代码片段中,我们导入了PrismaClient ,然后创建了一个变量来初始化客户端。
在POST方法中,我们使用prisma的create 查询,在数据库中创建一个新的记录,然后将请求体传给数据对象。
现在我们可以创建一个路由来获取所有的工作。这将是一个GET请求,找到所有的工作,并以json格式返回。
...
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
...
app.get('/', async (req, res) => {
const job = await prisma.job.findMany();
res.json(job);
});
你可以尝试自己完成UPDATE和DELETE方法,以熟悉ORM的使用。
最后的代码应该是这样的。
const { PrismaClient } = require("@prisma/client");
const express = require("express");
const prisma = new PrismaClient();
const app = express();
app.use(express.json());
app.post("/job", async (req, res) => {
const job = await prisma.job.create({ data: req.body });
res.json(job);
});
app.get("/", async (req, res) => {
const job = await prisma.job.findMany();
res.json(job);
});
const port = process.env.PORT || "3000";
app.listen(port, () => {
console.log(`Server Running at ${port} 🚀`);
});
这样,你就使用Node.js(Express)、Postgres和PRISMA创建了一个简单的、可运行的API。🙌
总结
Prisma是一个非常强大的ORM。它提供了很多开箱即用的功能,但关键的特点是与其他ORM相比,它的易用性。
在这篇文章中,我们涵盖了。
- Prisma的基础知识。
- 如何设置Prisma并连接到Postgres。
- 如何创建一个API来查询数据库。
还值得注意的是,像prisma migrate 这样的命令比文章中演示的更强大,值得好好研究一下。
Prisma并不单独支持Postgres。它支持多种SQL数据库,所以可以随意使用你最喜欢的数据库进行实验。