Prisma 提供了一套完整的数据库操作命令:db pull(从数据库同步 Schema)、db push(推送 Schema 到数据库)、db seed(填充数据)、db execute(执行原生 SQL)以及 migrate 系列(迁移管理)。本文详解各命令的用法、场景与最佳实践。
| 命令 | 方向 | 用途 | 适用场景 |
|---|---|---|---|
db pull | Database → Schema | 从数据库反向生成 Schema | 已有数据库初始化项目 |
db push | Schema → Database | 快速同步 Schema 到数据库 | 原型开发、快速迭代 |
db seed | Script → Database | 填充初始/测试数据 | 数据库初始化 |
db execute | SQL → Database | 执行原生 SQL | 存储过程、批量操作 |
migrate dev | Schema + Migrations → Database | 生成并执行迁移文件 | 开发环境、团队协作 |
migrate deploy | Migrations → Database | 只执行已有迁移 | 生产环境 |
npx prisma db pull # 同步到 schema.prisma
npx prisma db pull --print # 打印但不写入文件
npx prisma db pull --force # 强制覆盖现有 Schema
npx prisma db pull --schema=./custom/path.prisma| SQL 类型 | Prisma 类型 |
|---|---|
| INT | Int |
| BIGINT | BigInt |
| VARCHAR(n) / TEXT | String |
| BOOLEAN | Boolean |
| DATETIME / TIMESTAMP | DateTime |
| DECIMAL(p,s) | Decimal |
| FLOAT / DOUBLE | Float |
| JSON | Json |
# 1. 初始化项目
npx prisma init
# 2. 配置 .env
# DATABASE_URL="mysql://user:password@localhost:3306/mydb"
# 3. 拉取 Schema
npx prisma db pull
# 4. 生成 Client
npx prisma generate
# 5. 建立迁移基线
npx prisma migrate dev --name init// package.json
{
"prisma": {
"seed": "ts-node prisma/seed.ts"
}
}// prisma/seed.ts
import { PrismaClient, Prisma } from '@prisma/client';
const prisma = new PrismaClient();
const userData: Prisma.UserCreateInput[] = [
{ username: 'admin', email: 'admin@example.com', name: 'Admin' },
{ username: 'editor', email: 'editor@example.com', name: 'Editor' },
];
async function main() {
// 清空(注意外键约束顺序)
await prisma.post.deleteMany();
await prisma.user.deleteMany();
await prisma.category.deleteMany();
// 创建数据
const users = await Promise.all(
userData.map(data => prisma.user.create({ data })),
);
const categories = await Promise.all(
['技术', '前端', '后端'].map(name => prisma.category.create({ data: { name } })),
);
// 创建关联数据
await prisma.post.create({
data: {
title: 'Prisma 入门',
content: '...',
published: true,
author: { connect: { id: users[0].id } },
categories: { connect: [{ id: categories[0].id }] },
},
});
console.log('数据填充完成');
}
main()
.catch(e => { console.error(e); process.exit(1); })
.finally(() => prisma.$disconnect());// 使用 upsert 代替 create,确保可重复执行
await prisma.user.upsert({
where: { email: 'admin@example.com' },
update: {},
create: { username: 'admin', email: 'admin@example.com', name: 'Admin' },
});# 执行 SQL 文件
npx prisma db execute --file=./scripts/init.sql
# 执行单条 SQL
npx prisma db execute --stdin <<< "CREATE INDEX idx_users_email ON users(email)"
# 指定数据库 URL
npx prisma db execute --file=./scripts/init.sql --url="postgresql://..."适用场景:创建存储过程、触发器、视图;批量数据更新;数据库初始化配置。
-- scripts/init.sql
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_posts_author ON posts(author_id);
CREATE VIEW active_users AS
SELECT id, username, email FROM users WHERE deleted_at IS NULL;# 修改 schema.prisma 后
npx prisma migrate dev --name add_user_avatar
# 只生成迁移文件不执行
npx prisma migrate dev --create-only --name add_field
# 查看迁移状态
npx prisma migrate status
# 解决迁移冲突
npx prisma migrate resolve --applied "migration_name"# 只执行未应用的迁移(不生成新迁移)
npx prisma migrate deploy手动调整 Schema,将识别为 String 的枚举字段改为 enum 定义:
enum Status {
ACTIVE
INACTIVE
PENDING
}# 检查配置
cat package.json | grep -A 2 "prisma"
# 确保 Prisma Client 已生成
npx prisma generate
# 手动执行排查
node prisma/seed.jsnpx prisma migrate status
npx prisma migrate resolve --applied "migration_name"
# 最后手段(会清空数据)
npx prisma migrate reset{
"scripts": {
"db:pull": "prisma db pull",
"db:push": "prisma db push",
"db:seed": "prisma db seed",
"db:studio": "prisma studio",
"migrate:dev": "prisma migrate dev",
"migrate:deploy": "prisma migrate deploy",
"migrate:reset": "prisma migrate reset",
"generate": "prisma generate"
}
}migrate deploy,确保迁移可追溯、可回滚migrate dev,生成迁移文件纳入版本控制db push 仅用于原型阶段,不生成迁移历史上一篇:Prisma 版本升级指南