还在手写sql?试试prisma

74 阅读2分钟

1. 说明

Prisma 是一个现代化的开源 ORM(对象关系映射)工具,专为简化数据库操作而设计。它支持多种数据库,包括 PostgreSQLMySQL等数据库,同时支持migration,维护开发过程中数据库更改引起的混乱。

2. 使用

1. 安装

yarn add prisma @prisma/client

2. 初始化prisma项目

npx prisma init

将生成prisma/schema.prisma与.env文件,

  • .env文件可与dotenv配合使用
DATABASE_URL="postgres://postgres:123456@localhost:5432/数据库名称
  • schema.prisma用于定义表、数据库连接、数据库类型,
datasource db {

    provider = "postgresql"

    url = env("DATABASE_URL")

}

generator client {
  provider      = "prisma-client-js"
  binaryTargets = ["native", "linux-musl-openssl-3.0.x"]
}

enum Gender { //定义枚举
  MALE
  FEMALE
}

model User {

    id              String           @id @unique @default(cuid())

    gender          Gender

    @@map("user")
}

3. 格式化schema.prisma

npx prisma format

4. 创建表

npx prisma create create_user

此时会在schmes生成一份/20250919150203_create_user/migration.sql,文件中会针对provider的类型生成对应的sql

4. 根据prisma生成数据类型

npx prisma generate

5. 生成migration

  1. 新增用户、密码字段
model User {

    id              String           @id @unique @default(cuid())
    
    username        String           @db.VarChar(100)
    /// @TypeGraphQL.omit(output: true) 查询结果过滤密码
    password        String           @db.VarChar(100)

    gender          Gender

}

2. 生成migration

npx prisma generate add_username_and_password_for_user

prisma会自动捕获user表新增了password, username字段,并生成对应的sql

6. 更新数据库

npx prisma run

执行的migrations中的sql,同时会生成_prisma_migrations表,记录migration中的执行情况

在node环境中应用

prisma支持express、koa,在项目中推荐koa

1. 安装koa包

yarn add koa @apollo/server @as-integrations/koa typedi http

2. 开启服务

import Container, { Service } from "typedi";
import { ApolloServer } from "@apollo/server";
import { ApolloServerPluginDrainHttpServer } from "@apollo/server/plugin/drainHttpServer";
import { createServer } from "http";

const app = new Koa();
const httpServer = createServer({ keepAlive: false }, app.callback());
const server = new ApolloServer({
    schema: mergeSchemas({
        schemas: [
            typeGraphql.buildSchemaSync({
                resolvers: [Resolver],
                globalMiddlewares: ,// 全局中间件
                container: Container,
                authChecker: () => boolean, //用户校验
                scalarsMap: [{ type: GraphQLScalarType, scalar: DateTimeResolver }],
                emitSchemaFile: true,
                validate: false
            })
        ]
    }),
    plugins: [ApolloServerPluginDrainHttpServer({ httpServer })], // 插件
    persistedQueries: false,
    allowBatchedHttpRequests: true, // 允许批量上传,用于文件上传
    formatError: (formattedError: GraphQLFormattedError, error: unknown) => {
          return formattedError; //错误处理
    }
});
server.start();


startApolloServer().then(async (apolloServer: any) => {
    const graphqlMiddleware = koaMiddleware(apolloServer, {
        context: async ({ ctx }: { ctx: Koa.Context }) => {
            // 补充上下文
        }
            
    })                                  
    app.use(graphqlMiddleware);
    await new Promise<void>((resolve) => httpServer.listen({ port: 8000 }, resolve));
    console.log(`🚀 Server ready at http://localhost:8000/graphql`);
})

3.查询

prisma.find({
    where: {
        name: '',
        
    }
})

4. 原生sql

prisma同时也支持原生sql查询


prisma.$queryRaw`select * from user`

  • 变量为空时的场景
import { Prisma } from "@prisma/client";
prisma.$queryRaw`select * from user where username = ${username ? username : Prisma.Empty}`
  • sql中使用in
import { Prisma } from "@prisma/client";
prisma.$queryRaw`select * from user where username in ${Prisma.join(username)}`
  • sql拼接
import { Prisma } from "@prisma/client";
const sql1 = Prisma.sql`where username = 'admin'`
const sql2 = Prisma.raw(`LIMIT ${take} OFFSET ${skip} `)
prisma.$queryRaw`select * from user ${sql1} ${sql2}`

总结

相比于其他的orm,prisma在灵活性、扩展性要强了很多,由于会根据实体生成数据类型,因此天然支持typescript;

同时还提供了语义化查询界面,使查询只需要在页面上勾选,便可轻松实现sql查询

Xnip2025-09-22_11-28-40.jpg