🧠 Prisma 表名大写 vs SQL 导出小写问题深度解析(附踩坑与解决方案)
一、背景:你看到的“诡异现象”
在使用 Prisma + MySQL 的过程中,经常会遇到一个非常困惑的问题:
👉 Prisma 里是
Permission / Role(大写开头)
👉 但数据库导出后变成permission / role(小写)
甚至更极端:
- Prisma 查询正常
- SQL 手写查询报错
- join 表对不上
- 表名忽大忽小
二、问题本质:这不是 Prisma bug,而是“数据库命名策略差异”
我们拆开看三层:
1️⃣ Prisma 层:模型是“逻辑名称”
model Permission {
id Int @id @default(autoincrement())
name String @unique
}
👉 这里的 Permission 是:
-
逻辑模型名
-
TypeScript 类型名
-
Prisma Client API 名
✔ 它只是“代码世界的名字”
2️⃣ Prisma 到数据库:通过 @@map 控制物理表名
如果你写:
model Permission {
@@map("Permission")
}
👉 数据库就会是:
Permission
但如果你不写:
👉 Prisma 默认会做“平台适配转换”
3️⃣ MySQL 层:默认行为(关键坑点)
MySQL 在不同系统上行为不同:
| 系统 | 表名是否区分大小写 |
|---|---|
| Linux | ✅ 区分 |
| Windows | ❌ 不区分 |
| Docker/Server | 通常区分 |
而 MySQL 默认还有一个配置:
lower_case_table_names
三、真正导致“大小写混乱”的根本原因
你现在的问题通常来自三种情况:
❌ 情况 1:Prisma 自动映射
Prisma 有时会:
Permission → permission
Role → role
❌ 情况 2:MySQL 自动降级
导出 SQL 时:
Permission → permission
❌ 情况 3:手动建表 + Prisma 混用
比如你现在这种情况:
Permission(Prisma)
permission(历史遗留)
👉 直接导致双表混乱
四、最危险的后果(你已经踩过)
如果大小写混乱,会导致:
❌ 1. JOIN 永远 0 rows
JOIN Permission p
但真实数据在:
permission
❌ 2. Prisma connect 失败
connect: [{ name: "xxx" }]
👉 查错表 = 连接失败
❌ 3. 外键直接报错
Cannot add or update child row
五、为什么 Prisma 不直接统一大小写?
因为 Prisma 设计目标是:
✔ 跨数据库兼容(PostgreSQL / MySQL / SQLite)
而不同数据库规则不同:
| 数据库 | 命名规则 |
|---|---|
| PostgreSQL | 全小写 |
| MySQL | 依赖系统 |
| SQLite | 不敏感 |
👉 所以 Prisma 不强制统一大小写
六、正确解决方案(重点)
✅ 方案 1:强制统一表名(推荐)
在 Prisma 明确写:
model Permission {
@@map("Permission")
}
model Role {
@@map("Role")
}
✔ 强制数据库保持一致
✅ 方案 2:全部改为小写(更推荐生产)
@@map("permission")
@@map("role")
👉 统一行业标准(推荐)
✅ 方案 3:彻底禁止混用(最重要)
必须做到:
❌ 不允许 Permission + permission 共存
🚨 清理 SQL:
DROP TABLE permission;
或迁移:
INSERT INTO Permission (name)
SELECT name FROM permission;
七、最佳实践(企业级 RBAC 推荐)
✔ 表命名规范
permission
role
user
role_permission
👉 全部小写
✔ Prisma 写法
@@map("permission")
@@map("role")
✔ 外键表显式建模(避免隐式表)
model RolePermission {
roleId Int
permissionId Int
}
八、你这个项目的真实问题总结
你现在的问题不是 Prisma bug,而是:
❗ “隐式 join 表 + 大小写不统一 + 手动 SQL 混用” 三重冲突
九、一句话总结
Prisma 的 Model 名是逻辑层(大写),数据库表名是物理层(大小写敏感),如果不统一映射规则,就会导致 SQL / Prisma / join 全部错位。
十、最终建议(非常重要)
如果你要彻底解决:
✔ 做三件事:
-
统一表名(建议全部小写)
-
删除重复 permission / Permission
-
Prisma 加 @@map 固定映射
-
不再手写 join table SQL
📌 如果你下一步要,我可以帮你做:
-
🔥 直接帮你重构 RBAC(企业级标准)
-
🔥 帮你清理现在数据库所有冲突表
-
🔥 或帮你改成“完全不会踩坑的 Prisma 权限系统”
📎 本文部分内容借助 AI 辅助生成,并由作者整理审核。