Skip to content

Prisma ORM V7

npx = pnpm dlx

以下为 mysql 示例

安装

bash
npm i @prisma/client @prisma/adapter-mariadb
npm i -D prisma tsx typescript dotenv

初始化

bash
npx prisma init

📄 prisma/schema.prisma

prisma
generator client {
  provider = "prisma-client"
  output   = "./generated" // v7版本必须填,Nuxt可改为 "../app/prisma"
}
datasource db {
  provider = "mysql"
}
model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  posts Post[]
}
model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  published Boolean  @default(false)
  author    User?    @relation(fields: [authorId], references: [id])
  authorId  Int?
}

📄 prisma.config.ts

ts
import { defineConfig, env } from "prisma/config";
import "dotenv/config";

export default defineConfig({
  schema: "prisma/schema.prisma",
  migrations: {
    path: "prisma/migrations",
    seed: "tsx ./prisma/seed.ts",
  },
  datasource: {
    url: env("DATABASE_URL"),
  },
});

📄 .env

env
DATABASE_URL="mysql://user:password@localhost:3306/mydb"

生成 Prisma Client

bash
npx prisma generate

迁移数据模型

bash
npx prisma migrate dev --name init

种子文件

📄 prisma/seed.ts

ts
import "dotenv/config";
import { PrismaClient } from "../app/prisma/client";
import adapter from "../server/utils/prisma-adapter";

const prisma = new PrismaClient({ adapter });

async function main() {
  const alice = await prisma.user.create({
    data: {
      name: "Alice",
      email: "alice@prisma.io",
      posts: {
        create: { title: "Hello World", published: true },
      },
    },
  });
  console.log(`Created user: ${alice.name}`);
}

main()
  .then(() => prisma.$disconnect())
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  });

运行种子

bash
npx prisma db seed

可添加至npm执行命令中

📄 package.json

json
{
  "scripts": {
    "seed": "prisma db seed"
  }
}

Nuxt 推荐配置

📄 server/utils/prisma-adapter.ts

ts
import { PrismaMariaDb } from "@prisma/adapter-mariadb";
import fs from "fs";

// 1. 读取 DATABASE URL
let connectionString: string;

// 根据环境可读取不同的配置文件
if (process.env.NODE_ENV !== "production") {
  const databaseUrl = process.env.DATABASE_URL;
  if (!databaseUrl) throw new Error("缺少 DATABASE_URL 环境变量");
  connectionString = databaseUrl;
} else {
  if (!fs.existsSync("./config.json")) throw new Error("缺少 config.json 配置文件");
  const config = JSON.parse(fs.readFileSync("./config.json", "utf8"));
  if (!config.database_url) throw new Error("缺少 database_url 配置项");
  connectionString = config.database_url;
}

// 2. 自动拆解 URL
const dbUrl = new URL(connectionString);

// 3. 把拆解出来的信息填入适配器
const adapter = new PrismaMariaDb({
  host: dbUrl.hostname,
  port: Number(dbUrl.port) || 3306,
  user: dbUrl.username,
  password: dbUrl.password,
  database: dbUrl.pathname.substring(1),
  connectionLimit: 5,
});

export default adapter;

📄 server/utils/prisma.ts

ts
import { PrismaClient } from "../../app/prisma/client";
import adapter from "./prisma-adapter";

// 4. 创建 PrismaClient 实例
const globalForPrisma = globalThis as any;

export const prisma =
  globalForPrisma.prisma ??
  new PrismaClient({ adapter });

if (process.env.NODE_ENV !== "production") {
  globalForPrisma.prisma = prisma;
}

相关命令

bash
# 初始化
npx prisma init

# 生成 Prisma Client
npx prisma generate

# 迁移数据(开发环境)
npx prisma migrate dev --name init 

# 迁移数据(生产环境)
npx prisma migrate deploy

# 直接 push schema(开发阶段常用)
npx prisma db push
npx prisma db push --accept-data-loss # 允许丢失数据

# 从数据库读取当前结构,生成 / 更新 schema.prisma
npx prisma db pull