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