跳到主要内容

Cursor 数据库开发:SQL、ORM 与 Prisma 集成

Cursor Database Development

数据库开发是现代软件工程的关键部分,Cursor 的 AI 能力可以显著加快模式设计、查询编写和 ORM 集成。本指南涵盖 SQL 编辑、ORM 设置、迁移以及 AI 辅助数据库优化的实用工作流。

前置条件​

在开始之前:

  • 安装 Cursor(建议使用最新版本)
  • 数据库服务器在本地运行或可远程访问(PostgreSQL、MySQL 或 SQLite)
  • 安装 Node.js(用于 ORM 工具)
  • 具备 SQL 和数据库概念的基础知识

在 Cursor 中设置数据库项目​

项目结构​

组织数据库相关文件以获得最佳 AI 上下文:

project/
prisma/
schema.prisma # Prisma 模式
migrations/ # 迁移文件
src/
db/
connection.ts # 数据库连接
queries/ # 原始 SQL 查询
repositories/ # 数据访问层
scripts/
seed.ts # 数据库种子
docker-compose.yml # 本地数据库设置

在 Cursor 中打开项目​

cd ~/my-database-project
cursor .

使用 Cursor 编辑 SQL​

编写复杂查询​

Cursor 擅长生成和优化 SQL。使用自然语言提示:

编写一个 PostgreSQL 查询,查找过去 30 天内按总订单价值排名前 5 的客户,
包括他们的姓名、电子邮件和总消费金额。

Cursor 将生成:

SELECT
c.id,
c.name,
c.email,
SUM(o.total_amount) AS total_spent
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.created_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY c.id, c.name, c.email
ORDER BY total_spent DESC
LIMIT 5;

查询优化​

粘贴一个慢查询并让 Cursor 优化它:

这个查询在包含 100 万行的表上耗时超过 3 秒。请优化它:
[粘贴查询]

Cursor 将建议索引、查询重写并解释性能改进。

SQL 文件支持​

Cursor 为 .sql 文件提供语法高亮和 IntelliSense:

  1. 创建一个 .sql 文件
  2. Cursor 自动启用 SQL 语言模式
  3. 使用 Ctrl+Space 自动补全表名和列名
专业提示

将可复用的查询模式存储在 .sql 文件中。Cursor 会对它们进行索引,并在生成新查询时引用它们。

Prisma 集成​

设置 Prisma​

在项目中初始化 Prisma:

npm install prisma @prisma/client
npx prisma init

使用 AI 设计模式​

用自然语言描述你的数据模型:

为电子商务应用设计一个 Prisma 模式,包含:
- 用户(角色:admin、customer、seller)
- 产品(含类别、库存跟踪)
- 订单(含状态、配送详情)
- 评价(关联到产品和用户)

Cursor 生成:

model User {
id Int @id @default(autoincrement())
email String @unique
name String
role Role @default(CUSTOMER)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt

orders Order[]
reviews Review[]
}

enum Role {
ADMIN
CUSTOMER
SELLER
}

model Product {
id Int @id @default(autoincrement())
name String
description String?
price Decimal @db.Decimal(10, 2)
inventory Int @default(0)
categoryId Int

category Category @relation(fields: [categoryId], references: [id])
reviews Review[]
orderItems OrderItem[]
}

model Category {
id Int @id @default(autoincrement())
name String @unique
products Product[]
}

model Order {
id Int @id @default(autoincrement())
status OrderStatus @default(PENDING)
total Decimal @db.Decimal(10, 2)
createdAt DateTime @default(now())
userId Int

user User @relation(fields: [userId], references: [id])
orderItems OrderItem[]
}

enum OrderStatus {
PENDING
PROCESSING
SHIPPED
DELIVERED
CANCELLED
}

model OrderItem {
id Int @id @default(autoincrement())
quantity Int
unitPrice Decimal @db.Decimal(10, 2)
orderId Int
productId Int

order Order @relation(fields: [orderId], references: [id])
product Product @relation(fields: [productId], references: [id])
}

model Review {
id Int @id @default(autoincrement())
rating Int
comment String?
createdAt DateTime @default(now())
userId Int
productId Int

user User @relation(fields: [userId], references: [id])
product Product @relation(fields: [productId], references: [id])

@@unique([userId, productId])
}

生成迁移​

模式更改后,生成并应用迁移:

npx prisma migrate dev --name add_user_roles

使用 Cursor 在应用之前审查迁移文件:

审查此迁移文件是否存在潜在的数据丢失或问题:
[粘贴 migration.sql 内容]

Prisma 客户端查询​

在 AI 辅助下生成类型安全查询:

编写一个 Prisma 查询,获取包含产品详情的用户的所有订单
const userOrders = await prisma.order.findMany({
where: { userId: 1 },
include: {
orderItems: {
include: {
product: {
select: {
name: true,
price: true,
},
},
},
},
},
orderBy: {
createdAt: 'desc',
},
});

TypeORM 和 Sequelize 工作流​

TypeORM 设置​

// src/db/data-source.ts
import { DataSource } from 'typeorm';
import { User } from './entities/User';
import { Order } from './entities/Order';

export const AppDataSource = new DataSource({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'user',
password: 'password',
database: 'myapp',
synchronize: false,
logging: true,
entities: [User, Order],
migrations: ['src/migrations/*.ts'],
});

Sequelize 模型​

// src/models/User.js
const { DataTypes } = require('sequelize');

module.exports = (sequelize) => {
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true,
},
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
}, {
tableName: 'users',
timestamps: true,
});

return User;
};

数据库模式可视化​

使用 Prisma ERD​

生成实体关系图:

npx prisma generate --generator erd

或让 Cursor 创建可视化模式:

为此项目中的 Prisma 模式创建一个 Mermaid ERD 图

AI 辅助查询优化​

分析查询性能​

分享你的查询和执行计划:

这个查询正在进行全表扫描。我可以添加哪些索引来优化它?

EXPLAIN ANALYZE SELECT * FROM orders WHERE status = 'pending' AND created_at > '2024-01-01';

Cursor 将建议:

CREATE INDEX idx_orders_status_created_at ON orders(status, created_at);

数据库设计审查​

让 Cursor 审查你的模式是否符合最佳实践:

审查此数据库模式:
1. 规范化问题
2. 外键上缺失的索引
3. 数据类型优化
4. 潜在的并发问题

用于本地开发的 Docker Compose​

version: '3.8'
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: dev
POSTGRES_PASSWORD: devpass
POSTGRES_DB: myapp
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data

mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: myapp
MYSQL_USER: dev
MYSQL_PASSWORD: devpass
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql

volumes:
postgres_data:
mysql_data:

常见数据库任务​

任务Cursor 提示示例
创建迁移"生成一个迁移,为 users 表添加软删除列"
种子数据"编写一个种子脚本,用 100 个测试用户填充数据库"
备份查询"编写一个 pg_dump 命令,仅备份 users 和 orders 表"
连接池"为具有 100 个并发用户的 Node.js 应用配置连接池"
审计日志"添加一个审计日志表,跟踪 orders 表的所有更改"

调试数据库问题​

连接问题​

我的 Prisma 客户端无法连接到 PostgreSQL。这是我的连接字符串和错误:
[粘贴错误]

迁移失败​

当迁移失败时:

  1. 检查迁移状态:
npx prisma migrate status
  1. 让 Cursor 分析失败并建议修复

  2. 解决冲突并根据需要标记为已应用:

npx prisma migrate resolve --applied migration_name

最佳实践​

安全性​

  • 永远不要将数据库凭据提交到版本控制
  • 使用环境变量存储连接字符串
  • 为生产连接启用 SSL
  • 使用参数化查询防止 SQL 注入

性能​

  • 在频繁查询的列上添加索引
  • 在生产环境中使用连接池
  • 为读密集型工作负载实现查询结果缓存
  • 监控慢查询日志

版本控制​

# Database
*.db
*.sqlite
*.sqlite3
.env
.env.local
prisma/migrations/migration_lock.toml

快速参考​

操作命令
生成 Prisma 客户端npx prisma generate
运行迁移npx prisma migrate dev
重置数据库npx prisma migrate reset
打开 Prisma Studionpx prisma studio
种子数据库npx prisma db seed
格式化模式npx prisma format

相关资源​

最后更新:2025 年 7 月