TTask - Part 6 Prisma 与 Postgresql 数据库配置

Published on
5 min read

Redux 笔记 文章中,在 server 项目中,写死了接口返回的数据。这篇文章就来配置 Postgresql 数据库和 Prism 实现对数据的增删改查。

Postgresql 数据库的安装与配置

本地安装 postgresql 除了占用本机存储外,切换新设备时还需要重新配置,使用 docker compose 借助 postgresql 镜像,可以快速搭建 postgresql 开发环境。

Docker compose 是用来定义和运行多容器 docker 应用的工具,在配置文件中配置多个服务,通过一条命令就能够同时运行多个服务。

配置 docker-compose.yml 文件

在根目录下新建 docker-compose.yml 配置文件,来配置 postgresql 数据库。

version: '3.7'
services:
  postgres:
    image: postgres:latest
    restart: always
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=ttask_db
    ports:
      - '5432:5432'
    volumes:
      - postgres:/var/lib/postgresql/data
volumes:
  postgres:

在根目录下的 package.json 中添加启动数据库容器的脚本,db:updb:down 分别执行 docker-compose up -ddocker-compose down 来启动和关闭镜像服务。

记得修改 Docker 镜像源,mac 上修改 docker 桌面客户端,在设置的 Docker Engine 的 Json 文件中添加国内源。

"registry-mirrors": [
  "https://hub-mirror.c.163.com/",
  "https://docker.mirrors.ustc.edu.cn",
  "https://registry.docker-cn.com"
]

修改之后重启 docker 通过 docker info 命令如果出现了 Registry Mirrors 表示配置已经生效。执行 pnpm db:up 启动 docker,通过 docker ps 查看本机 docker 镜像。我在 mac 上使用 TablePlus App 来访问数据库,启动之后就可以在 App 中简历对数据库的链接了。

Prisma

依赖安装

pnpm i prisma -D --filter server

接下来在 server 项目下执行 pnpm prisma init 来创建 prisma 需要的 scheme 文件。

连接数据库

执行完上面的初始化代码之后,prisma 会在项目目录下新建 prisma 文件夹,新增了 scheme.prisma 文件,并新建了 .env 文件,修改了 .gitignore 文件。我们需要做的是在 .env 文件中填写正确的数据库链接链接,链接规则可以查看这里

新建数据库表

scheme.prisma 文件中添加 Todo 任务数据模型。

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model Todo {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  title     String   @db.VarChar(255)
  content   String?
  author    User?    @relation(fields: [authorId], references: [id])
  authorId  Int?
}

model Profile {
  id     Int     @id @default(autoincrement())
  bio    String?
  user   User    @relation(fields: [userId], references: [id])
  userId Int     @unique
}

model User {
  id      Int      @id @default(autoincrement())
  email   String   @unique
  name    String?
  todos   Todo[]
  profile Profile?
}

在终端中运行如下命令,创建数据库以及 User/Profile/Todo 数据表。

pnpm run prisma migrate dev --name init

上面的命令主要做了两个工作

  1. 创建 prisma/migrations 目录下新建 SQL 转换文件
  2. 执行上面新建的文件,操作数据库

新建 prisma.ts 文件用于导出 @prisma/client 的实例

import { PrismaClient } from '@prisma/client';

export const prisma = new PrismaClient();

接下来在 controllers 中添加创建用户与获取用户数据的 API

import { Controller, Get, Post, RouterContext } from '@swizm/nflask';
import koaBody from 'koa-body';
import { prisma } from '../../prisma';

@Controller('/user')
class User {
  @Post('/', koaBody())
  async createNewUser(ctx: RouterContext) {
    const body = ctx.request.body;
    if (body) {
      const { name, email }: { name?: string; email: string } = ctx.request.body;
      const user = await prisma.user.create({
        data: {
          name,
          email,
        },
      });
      ctx.body = user;
      return;
    }
    ctx.status = 400;
    ctx.body = {
      msg: 'incorrect field',
    };
  }

  @Get('/:id')
  async getUserById(ctx: RouterContext) {
    const { id } = ctx.params;
    const user = await prisma.user.findUnique({
      where: {
        id: Number(id),
      },
    });
    ctx.body = user;
  }
}

export default User;

启动 server 服务之后,就可以调用接口新建用户以及查询用户信息了,同时在可视化数据库客户端上就能查看到数据了。

sql