Skip to content

Prisma ORM V7

npx = pnpm dlx

以下为 mysql 示例

安装

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

数据库

🗄️PostgreSQL

📄schema.prisma

prisma
datasource db {
  provider = "postgresql" // or "cockroachdb" for CockroachDB
}

📄.env

env
DATABASE_URL="postgresql://user:pass@host:5432/database"

驱动器

bash
npm install @prisma/adapter-pg
ts
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "./generated/prisma";
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });

🗄️MySQL

📄schema.prisma

prisma
datasource db {
  provider = "mysql"
}

📄.env

env
DATABASE_URL="mysql://user:pass@host:3306/database"

驱动器

bash
npm install @prisma/adapter-mariadb
ts
import { PrismaMariaDb } from "@prisma/adapter-mariadb";
import { PrismaClient } from "./generated/prisma";

const adapter = new PrismaMariaDb({
  host: "localhost",
  port: 3306,
  connectionLimit: 5,
});
const prisma = new PrismaClient({ adapter });

🗄️SQLite

📄schema.prisma

prisma
datasource db {
  provider = "sqlite"
}

📄.env

env
DATABASE_URL="file:./path/to/database.db"

驱动器

bash
npm install @prisma/adapter-better-sqlite3
ts
import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
import { PrismaClient } from "./generated/prisma";

const adapter = new PrismaBetterSqlite3({ url: "file:./prisma/dev.db" });
const prisma = new PrismaClient({ adapter });

初始化

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;
}

📄server/api/users.get.ts

ts
export default defineEventHandler(async () => {
  const users = await prisma.user.findMany();
  return users;
});

📄server/api/users.post.ts

ts
export default defineEventHandler(async (event) => {
  const body = await readBody<{ name: string }>(event);

  const user = await prisma.user.create({
    data: {
      name: body.name,
    },
  });

  return user;
});

相关命令

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

# 重置数据库
npx prisma migrate reset