Cursor
Cursor 是一款由 AI 驱动的代码编辑器,旨在通过自动化重复性编码任务来提高生产力。当与 Prisma 搭配使用时(Prisma 是一个功能强大且类型安全的数据库工作流程工具包),它成为一个用于管理和优化数据库架构、查询和数据填充的强大解决方案。
本指南提供了将 Prisma 与 Cursor 有效结合使用的详细说明,以实现以下目的:
- 使用
.cursorrules定义项目特定的最佳实践。 - 利用 Cursor 的上下文感知能力。
- 生成针对数据库量身定制的架构、查询和种子数据。
虽然本指南侧重于 Cursor,但这些模式应该适用于任何 AI 编辑器。在 X 上告诉我们,如果您希望我们为您首选的工具创建指南!
Prisma MCP 服务器
Prisma 提供了自己的 模型上下文协议 (MCP) 服务器,可让您管理 Prisma Postgres 数据库、建模数据库架构并通过迁移进行聊天。在此处了解有关如何将其添加到 Cursor 的更多信息这里。您还可以通过点击以下链接,使用一键安装将 Prisma MCP 服务器添加到 Cursor。
这将提示您在浏览器中打开 Cursor 应用程序。打开后,您将被引导将 Prisma MCP 服务器直接安装到您的 Cursor 配置中。
使用 .cursorrules 定义项目特定的规则
Cursor 中的 .cursorrules 文件 允许您强制执行针对您的 Prisma 项目量身定制的最佳实践和开发标准。通过定义清晰一致的规则,您可以确保 Cursor 生成干净、可维护且项目特定的代码,并最大限度地减少手动调整。
要实施这些规则,请在项目根目录中创建 .cursorrules 文件。以下是示例配置:
示例 .cursorrules 文件
.cursorrules 文件You are a senior TypeScript/JavaScript programmer with expertise in Prisma, clean code principles, and modern backend development.
Generate code, corrections, and refactorings that comply with the following guidelines:
TypeScript General Guidelines
Basic Principles
- Use English for all code and documentation.
- Always declare explicit types for variables and functions.
- Avoid using "any".
- Create precise, descriptive types.
- Use JSDoc to document public classes and methods.
- Maintain a single export per file.
- Write self-documenting, intention-revealing code.
Nomenclature
- Use PascalCase for classes and interfaces.
- Use camelCase for variables, functions, methods.
- Use kebab-case for file and directory names.
- Use UPPERCASE for environment variables and constants.
- Start function names with a verb.
- Use verb-based names for boolean variables:
- isLoading, hasError, canDelete
- Use complete words, avoiding unnecessary abbreviations.
- Exceptions: standard abbreviations like API, URL
- Accepted short forms:
- i, j for loop indices
- err for errors
- ctx for contexts
Functions
- Write concise, single-purpose functions.
- Aim for less than 20 lines of code.
- Name functions descriptively with a verb.
- Minimize function complexity:
- Use early returns.
- Extract complex logic to utility functions.
- Leverage functional programming techniques:
- Prefer map, filter, reduce.
- Use arrow functions for simple operations.
- Use named functions for complex logic.
- Use object parameters for multiple arguments.
- Maintain a single level of abstraction.
Data Handling
- Encapsulate data in composite types.
- Prefer immutability.
- Use readonly for unchanging data.
- Use as const for literal values.
- Validate data at the boundaries.
Error Handling
- Use specific, descriptive error types.
- Provide context in error messages.
- Use global error handling where appropriate.
- Log errors with sufficient context.
Prisma-Specific Guidelines
Schema Design
- Use meaningful, domain-driven model names.
- Leverage Prisma schema features:
- Use @id for primary keys.
- Use @unique for natural unique identifiers.
- Utilize @relation for explicit relationship definitions.
- Keep schemas normalized and DRY.
- Use meaningful field names and types.
- Implement soft delete with deletedAt timestamp.
- Use Prisma's native type decorators.
Prisma Client Usage
- Always use type-safe Prisma client operations.
- Prefer transactions for complex, multi-step operations.
- Handle optional relations explicitly.
- Use Prisma's filtering and pagination capabilities.
Database Migrations
- Create migrations for schema changes.
- Use descriptive migration names.
- Review migrations before applying.
- Never modify existing migrations.
- Keep migrations idempotent.
Error Handling with Prisma
- Catch and handle Prisma-specific errors:
- PrismaClientKnownRequestError
- PrismaClientUnknownRequestError
- PrismaClientValidationError
- Provide user-friendly error messages.
- Log detailed error information for debugging.
Testing Prisma Code
- Use in-memory database for unit tests.
- Mock Prisma client for isolated testing.
- Test different scenarios:
- Successful operations
- Error cases
- Edge conditions
- Use factory methods for test data generation.
- Implement integration tests with actual database.
Performance Considerations
- Use select and include judiciously.
- Avoid N+1 query problems.
- Use findMany with take and skip for pagination.
- Leverage Prisma's distinct for unique results.
- Profile and optimize database queries.
Security Best Practices
- Never expose raw Prisma client in APIs.
- Use input validation before database operations.
- Implement row-level security.
- Sanitize and validate all user inputs.
- Use Prisma's built-in protections against SQL injection.
Coding Style
- Keep Prisma-related code in dedicated repositories/modules.
- Separate data access logic from business logic.
- Create repository patterns for complex queries.
- Use dependency injection for Prisma services.
Code Quality
- Follow SOLID principles.
- Prefer composition over inheritance.
- Write clean, readable, and maintainable code.
- Continuously refactor and improve code structure.
Development Workflow
- Use version control (Git).
- Implement comprehensive test coverage.
- Use continuous integration.
- Perform regular code reviews.
- Keep dependencies up to date.
此文件确保一致且可维护的代码生成,减少手动干预,同时提高项目质量。
使用 Cursor 的上下文感知能力
Cursor 的 上下文感知 功能允许您添加特定的网站、文件、文件夹或文档,以增强其对项目的理解。通过将您的 schema.prisma 文件添加为上下文,您可以使 Cursor 根据您的数据库架构生成更准确的查询、测试和种子数据。
将 Prisma 文档 llm.txt 文件添加为 @Docs 上下文
为了提高 Cursor 对项目中与 Prisma 相关建议的理解,请将 /llms.txt Markdown 文件作为上下文包含在内。此文件提供了 Prisma 文档的简洁概述、有用指南和详细链接,所有这些都经过 LLM 处理优化。只需导航到 URL,并将其添加为 Cursor 配置中的 @Docs 资源。
添加额外的 Prisma 文档
Cursor 已包含来自 Prisma 文档的内置上下文,因此您无需添加任何内容即可使用我们的文档!
要了解最新更改或合并额外上下文,请将这些资源添加为 @Docs 上下文:
- Prisma 更改日志,用于更新和新功能。
- Prisma 博客,用于实用指南和最佳实践。
要了解如何添加和管理文档上下文,请访问 Cursor 文档。
使用架构作为上下文
在请求查询、测试或种子脚本之前,使用 @Files 语法将您的 schema.prisma 文件(或整个代码库)添加为上下文。这允许 Cursor 生成精确的、由架构驱动的输出,例如查询、测试和种子数据。例如,在 Cursor Chat 中,您可以通过键入 @Files,然后添加您的 schema.prisma 文件来包含您的架构。
生成 Prisma 架构
Cursor 可以从高级描述生成 Prisma 架构,使您能够快速为数据库架构建立坚实的基础。通过提供清晰详细的提示,Cursor 可以创建满足您要求的 Prisma 架构。无论您需要通用的基础架构还是针对详细用例的高度特定架构,Cursor 都可以精确交付。以下是一个示例提示及其对应的结果:
如果您运行以下提示,您可能会收到不同的输出,因为 LLM 会产生非确定性响应。
- 生成 Prisma 架构的提示
- 结果
"Create a Prisma schema for a SaaS app using PostgreSQL as a provider with `User`, `Organization`, and `Subscription` models, ensuring all models include `createdAt` and `updatedAt` DateTime fields with defaults, a soft-delete `deletedAt` field, and proper relationships between entities."
generator client {
provider = "prisma-client"
output = "./generated"
}
datasource db {
provider = "postgresql"
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String
password String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
organization Organization @relation(fields: [organizationId], references: [id])
organizationId Int
role UserRole @default(MEMBER)
}
model Organization {
id Int @id @default(autoincrement())
name String
slug String @unique
subscription Subscription?
users User[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
}
model Subscription {
id Int @id @default(autoincrement())
organization Organization @relation(fields: [organizationId], references: [id])
organizationId Int @unique
plan SubscriptionPlan
status SubscriptionStatus @default(ACTIVE)
startDate DateTime
endDate DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
}
enum UserRole {
ADMIN
MEMBER
}
enum SubscriptionPlan {
FREE
BASIC
PREMIUM
ENTERPRISE
}
enum SubscriptionStatus {
ACTIVE
CANCELED
EXPIRED
PAST_DUE
}
生成 Prisma 查询
Cursor 可以帮助您创建针对 Prisma 架构量身定制的查询,无论是用于基本数据检索还是复杂的优化操作。为了获得最佳结果,请专注于编写清晰、具体的提示,定义您的要求,例如要包含的字段、要应用的条件以及要遍历的关系。这可确保 Cursor 生成准确、高性能且类型安全的查询。以下是一个示例提示及其生成的查询:
- 生成数据库查询的提示
- 结果
"Generate a query to retrieve all User records associated with an Organization that has an `active` Subscription, while excluding any records where the deletedAt field is set."
const activeUsers = await prisma.user.findMany({
where: {
deletedAt: null,
organization: {
deletedAt: null,
subscription: {
deletedAt: null,
status: 'ACTIVE'
}
}
},
include: {
organization: {
include: {
subscription: true
}
}
},
orderBy: {
createdAt: 'desc'
},
skip: 0,
take: 10
});
使用 Cursor 创建种子文件
编写种子脚本可能是一个繁琐的过程,但 Cursor 通过快速生成结构化和有组织的种子代码来简化它。通过提供清晰的说明,您可以指导 Cursor 创建脚本,用真实数据填充您的数据库,包括处理架构中定义的关系和复杂结构。以下是一个示例提示及其生成的种子脚本:
- 填充数据库的提示
- 结果
"Generate code to populate the Prisma schema with realistic data for the User, Organization, and Subscription models, ensuring all necessary fields are included."
import {
PrismaClient,
UserRole,
SubscriptionPlan,
SubscriptionStatus,
} from "../prisma/generated/client";
const prisma = new PrismaClient();
async function main() {
// Clear existing data
await prisma.user.deleteMany();
await prisma.subscription.deleteMany();
await prisma.organization.deleteMany();
const organizations = [
{
name: "Tech Innovators",
slug: "tech-innovators",
subscription: {
plan: SubscriptionPlan.ENTERPRISE,
status: SubscriptionStatus.ACTIVE,
startDate: new Date("2024-01-01"),
},
users: [
{
name: "Emma Thompson",
email: "emma@techinnovators.com",
role: UserRole.ADMIN,
password: "password123",
},
{
name: "Michael Chen",
email: "michael@techinnovators.com",
role: UserRole.MEMBER,
password: "password123",
},
],
},
{
name: "Digital Solutions",
slug: "digital-solutions",
subscription: {
plan: SubscriptionPlan.PREMIUM,
status: SubscriptionStatus.ACTIVE,
startDate: new Date("2024-01-15"),
},
users: [
{
name: "Sarah Wilson",
email: "sarah@digitalsolutions.com",
role: UserRole.ADMIN,
password: "password123",
},
{
name: "James Miller",
email: "james@digitalsolutions.com",
role: UserRole.MEMBER,
password: "password123",
},
],
},
{
name: "Cloud Systems",
slug: "cloud-systems",
subscription: {
plan: SubscriptionPlan.BASIC,
status: SubscriptionStatus.ACTIVE,
startDate: new Date("2024-02-01"),
},
users: [
{
name: "David Garcia",
email: "david@cloudsystems.com",
role: UserRole.ADMIN,
password: "password123",
},
{
name: "Lisa Wang",
email: "lisa@cloudsystems.com",
role: UserRole.MEMBER,
password: "password123",
},
],
},
{
name: "Data Analytics Co",
slug: "data-analytics",
subscription: {
plan: SubscriptionPlan.PREMIUM,
status: SubscriptionStatus.ACTIVE,
startDate: new Date("2024-01-10"),
},
users: [
{
name: "Alex Johnson",
email: "alex@dataanalytics.com",
role: UserRole.ADMIN,
password: "password123",
},
{
name: "Rachel Kim",
email: "rachel@dataanalytics.com",
role: UserRole.MEMBER,
password: "password123",
},
],
},
{
name: "Smart Solutions",
slug: "smart-solutions",
subscription: {
plan: SubscriptionPlan.FREE,
status: SubscriptionStatus.ACTIVE,
startDate: new Date("2024-02-15"),
},
users: [
{
name: "Daniel Brown",
email: "daniel@smartsolutions.com",
role: UserRole.ADMIN,
password: "password123",
},
{
name: "Maria Rodriguez",
email: "maria@smartsolutions.com",
role: UserRole.MEMBER,
password: "password123",
},
],
},
];
for (const org of organizations) {
const createdOrg = await prisma.organization.create({
data: {
name: org.name,
slug: org.slug,
subscription: {
create: {
plan: org.subscription.plan,
status: org.subscription.status,
startDate: org.subscription.startDate,
},
},
},
});
for (const user of org.users) {
await prisma.user.create({
data: {
name: user.name,
email: user.email,
password: user.password,
role: user.role,
organizationId: createdOrg.id,
},
});
}
}
console.log("Seed data created successfully");
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
使用 Prisma VS Code 扩展管理数据库
Prisma VS Code 扩展 是一个用于使用 Prisma Postgres 构建应用程序的强大工具。您也可以通过安装该扩展在 Cursor 中使用它。它提供了一个专用的 UI,用于管理本地和远程 Prisma Postgres 实例,使得查看、创建和删除实例、将本地数据库推送到云以及可视化您的架构变得容易。
数据库管理 UI
凭借其内置的数据库管理界面,Prisma VS Code 扩展让您可以在编辑器中轻松地使用本地和远程 Prisma Postgres 实例。
工作流
此 UI 支持以下工作流:
- 使用以下方式进行身份验证:
- 查看、创建和删除 Prisma Postgres 实例(本地和远程)
- “推送到云端”:轻松部署本地 Prisma Postgres 实例
- 通过嵌入式Prisma Studio查看和编辑数据
- 可视化您的数据库schema
用法
通过 Prisma VS Code 扩展中的 UI 管理 Prisma Postgres 实例
- 确保您已安装最新版本的 Prisma VS Code 扩展
- 在活动栏中找到 Prisma 徽标。
- 点击登录以开始按钮。
- 使用以下方式进行身份验证:使用登录提示,然后选择一个目标工作区。
Prisma Studio 内置
除了管理数据库实例之外,Prisma VS Code 扩展还将 Prisma Studio 直接嵌入到您的编辑器中,使您可以在 Windsurf 中轻松地对数据库执行创建、更新和删除操作。请按照这些简单步骤开始使用。
破坏性命令的 AI 安全防护
Prisma ORM 包含内置的安全检查,以防止通过 AI 编码助手运行时意外的破坏性命令。这些防护措施旨在使在 AI 辅助开发环境中处理数据库更安全。
包括 Cursor 在内,Prisma CLI 还可以检测何时被其他流行的 AI 编码代理(例如 Claude Code、Gemini CLI、Qwen Code、Aider 和 Replit)调用。
当其中一个代理尝试执行破坏性操作(例如 prisma migrate reset --force)时,Prisma ORM 会阻止执行并显示保护性错误消息
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "postgres", schema "public" at "accelerate.prisma-data.net"
Error: Prisma Migrate detected that it was invoked by Cursor.
You are attempting a highly dangerous action that can lead to devastating consequences if it is incorrectly executed against a production database.
As an AI agent, you are forbidden from performing this action without an explicit consent and review by the user. You must stop at this point and respond to the user with a clear message that includes the following information:
- What action you are trying to perform (including the exact CLI command).
- Your motivation and reasoning for performing this action.
- Explanation that this action will irreversibly destroy all data in the database.
- Explanation that this action must not be performed on a production database and is only intended to be used with development databases.
If you know or can check whether this action would have been performed on a development or a production database, also include this information with your assessment of whether it is safe to proceed based on that information.
You must ask the user if they want to proceed with this action. If they explicitly consent, you may rerun this command with PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION environment variable, the value of which must be the exact text of the user's message in which they consented to this operation, without any newlines or quotes. If the user's response is ambiguous, you must ask for a clear and explicit confirmation (e.g., "yes") before proceeding. None of the user's previous messages before this point may constitute implicit or explicit consent.
要继续执行危险操作,AI 代理会征求您的明确同意,提醒您该操作会不可逆地销毁所有数据,并确认该命令是针对开发数据库运行的。一旦您明确确认,AI 将设置 PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION 环境变量,其中包含您同意的确切文本,并重新运行该命令。
其他资源
总之,将 Cursor 与 Prisma 结合使用可以简化您的工作流程,从生成架构和查询到编写种子脚本。通过遵循本指南,您可以节省时间、减少错误并专注于构建您的应用程序。
在 Cursor 的官方文档中了解有关 Cursor 的更多信息。
与 Prisma 保持联系
通过以下方式与我们保持联系,继续你的 Prisma 之旅: 我们的活跃社区。保持信息灵通,参与其中,并与其他开发人员协作。
- 在 X 上关注我们 获取公告、直播活动和实用技巧。
- 加入我们的 Discord 提问、与社区交流,并通过对话获得积极支持。
- 在 YouTube 上订阅 获取教程、演示和直播。
- 在 GitHub 上参与 加星收藏存储库、报告问题或为问题做出贡献。