← スキル一覧に戻る

prisma
by proyecto26
prismaは、other分野における実用的なスキルです。複雑な課題への対応力を強化し、業務効率と成果の質を改善します。
⭐ 68🍴 11📅 2026年1月23日
SKILL.md
name: prisma description: Prisma ORM and PostgreSQL database operations. Use when working with database schema, migrations, queries, or the @projectx/db package. allowed-tools: Read, Grep, Glob, Edit, Write, Bash(pnpm:), Bash(npx prisma:)
Prisma Database Operations
Database Package Location
The Prisma schema and client are in packages/db/.
Schema Location
packages/db/
├── prisma/
│ ├── schema.prisma # Database schema
│ ├── migrations/ # Migration history
│ └── seed.ts # Seed script
└── src/
└── lib/
├── prisma.service.ts # NestJS Prisma service
└── [model]/ # Repository services
└── [model]-repository.service.ts
Common Commands
# Generate Prisma client after schema changes
pnpm prisma:generate
# Create and apply migration (development)
pnpm prisma:migrate:dev
# Apply migrations (production)
pnpm prisma:migrate
# Seed the database
pnpm prisma:seed
# Open Prisma Studio
pnpm --filter @projectx/db exec prisma studio
Schema Patterns
Basic Model
model Product {
id String @id @default(cuid())
name String
description String?
price Decimal @db.Decimal(10, 2)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Relations
categoryId String
category Category @relation(fields: [categoryId], references: [id])
orderItems OrderItem[]
@@index([categoryId])
@@map("products")
}
PostGIS Geometry Support
model Location {
id String @id @default(cuid())
name String
// PostGIS geometry stored as Unsupported type
point Unsupported("geometry(Point, 4326)")
@@map("locations")
}
Enums
enum OrderStatus {
PENDING
PROCESSING
SHIPPED
DELIVERED
CANCELLED
}
Repository Pattern
Creating a Repository Service
// packages/db/src/lib/product/product-repository.service.ts
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma.service';
import { Prisma, Product } from '@prisma/client';
@Injectable()
export class ProductRepositoryService {
constructor(private readonly prisma: PrismaService) {}
async findAll(params?: {
skip?: number;
take?: number;
cursor?: Prisma.ProductWhereUniqueInput;
where?: Prisma.ProductWhereInput;
orderBy?: Prisma.ProductOrderByWithRelationInput;
}): Promise<Product[]> {
return this.prisma.product.findMany(params);
}
async findById(id: string): Promise<Product | null> {
return this.prisma.product.findUnique({
where: { id },
include: { category: true },
});
}
async create(data: Prisma.ProductCreateInput): Promise<Product> {
return this.prisma.product.create({ data });
}
async update(id: string, data: Prisma.ProductUpdateInput): Promise<Product> {
return this.prisma.product.update({
where: { id },
data,
});
}
async delete(id: string): Promise<Product> {
return this.prisma.product.delete({ where: { id } });
}
}
Query Patterns
Filtering and Pagination
const products = await prisma.product.findMany({
where: {
name: { contains: 'shirt', mode: 'insensitive' },
price: { gte: 10, lte: 100 },
category: { name: 'Clothing' },
},
skip: 0,
take: 20,
orderBy: { createdAt: 'desc' },
include: { category: true },
});
Transactions
const [order, inventory] = await prisma.$transaction([
prisma.order.create({ data: orderData }),
prisma.inventory.update({
where: { productId },
data: { quantity: { decrement: quantity } },
}),
]);
Raw SQL (for PostGIS)
const nearbyLocations = await prisma.$queryRaw`
SELECT id, name, ST_AsGeoJSON(point) as geojson
FROM locations
WHERE ST_DWithin(
point,
ST_SetSRID(ST_MakePoint(${lng}, ${lat}), 4326)::geography,
${radiusMeters}
)
`;
Migration Workflow
- Modify schema.prisma with your changes
- Generate migration:
pnpm prisma:migrate:dev --name descriptive_name - Review migration in
prisma/migrations/ - Test locally before committing
- Apply in production:
pnpm prisma:migrate
Seeding
// packages/db/prisma/seed.ts
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
// Upsert to avoid duplicates
await prisma.category.upsert({
where: { slug: 'electronics' },
update: {},
create: {
name: 'Electronics',
slug: 'electronics',
},
});
}
main()
.catch(console.error)
.finally(() => prisma.$disconnect());
Best Practices
- Use repository services instead of direct Prisma calls in controllers
- Always include
@@mapfor explicit table names - Add indexes for frequently queried fields
- Use transactions for related operations
- Name migrations descriptively (e.g.,
add_product_inventory) - Validate data at the application layer before database operations
スコア
総合スコア
70/100
リポジトリの品質指標に基づく評価
✓SKILL.md
SKILL.mdファイルが含まれている
+20
○LICENSE
ライセンスが設定されている
0/10
✓説明文
100文字以上の説明がある
+10
○人気
GitHub Stars 100以上
0/15
✓最近の活動
1ヶ月以内に更新
+10
✓フォーク
10回以上フォークされている
+5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
✓タグ
1つ以上のタグが設定されている
+5
レビュー
💬
レビュー機能は近日公開予定です

