跳至主要内容

Tabnine

Tabnine 是一个 AI 软件开发平台,作为 IDE(如 VS Code、WebStorm、IntelliJ 等)的扩展程序

概述

它通过以下方式帮助开发者更快地编写代码:

  • 在编辑器中为小型、重复的编码任务提供上下文感知的代码补全建议
  • 为更高级别的任务和详细说明提供集成的聊天功能

为什么要将 Prisma ORM 与 Tabnine 结合使用?

像 Tabnine 这样的 AI 编辑器是强大的工具,可以大大提高开发者的生产力。它在以下工作流程中表现尤其出色:

  • 数据建模和数据库模式设计
  • 构建和优化数据库查询
  • 生成 CRUD 功能和其他样板代码
  • 生成可与 TypedSQL 配合使用的纯 SQL 查询
  • 生成单元测试和集成测试的代码
  • 指导重大重构
  • 生成种子脚本

利用 Prisma 模式

由于 Prisma 拥有自己的模式,Tabnine 可以理解数据的基本形状并帮助您编写堆栈其他部分的代码。

因此,我们建议您首先定义 Prisma 模式,然后使用 Tabnine 构建围绕它的应用层(包括 API 调用、DTO、业务逻辑、第三方集成等)。

数据建模和数据库模式设计

Tabnine 如何提供帮助

从头开始设计数据库模式涉及大量样板代码,并且可能非常耗时。

Tabnine 可以通过以下方式加速此过程:

  • 生成模型、索引、约束和关系的样板代码。
  • 通过遵循命名和其他约定来保持模式的一致性。
  • 根据常见的数据库模式自动完成模型和字段定义。
  • 根据命名约定建议关系和字段类型。

示例:定义 Prisma 模式

提示

为具有 User、Organization 和 Subscription 模型的 SaaS 应用程序定义 Prisma 模式。确保关系已正确设置。

生成代码

generator client {
provider = "prisma-client"
output = "./generated"
}

datasource db {
provider = "postgresql"
}

model User {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
email String @unique
name String
organization Organization @relation(fields: [organizationId], references: [id])
organizationId Int
}

model Organization {
id Int @id @default(autoincrement())
name String
slug String @unique
subscription Subscription?
users User[]
}

model Subscription {
id Int @id @default(autoincrement())
organization Organization @relation(fields: [organizationId], references: [id])
organizationId Int @unique
plan String
status Status
}

enum Status {
Active
Paused
Expired
}

构建和优化数据库查询

Tabnine 如何提供帮助

Prisma ORM 提供了一个方便的高级 API,用于直观地编写数据库查询。然而,涉及过滤器、分页和高级模式的查询仍然可能变得复杂。

Tabnine 可以通过以下方式提供帮助:

  • 根据模式自动完成 Prisma 查询。
  • 为过滤器建议 where 子句,为分页逻辑建议 skip / take 选项。
  • 帮助提高效率和性能优化。

示例:通过关系获取数据

提示

生成一个 Prisma 查询,从具有活动订阅的组织中获取所有活动用户。在查询结果中包含用户组织的数据。

生成代码

const activeUsers = await prisma.user.findMany({
where: {
organization: {
subscription: {
status: "ACTIVE"
}
}
},
include: {
organization: true
}
});

生成 CRUD 功能和其他样板代码

Tabnine 如何提供帮助

大多数应用程序需要基本的 CRUD 操作或其他通常源自数据库模式结构的样板代码。例如,API 层可能会公开一组 HTTP 端点,允许创建、读取、更新或删除特定模型记录。同样,前端将数据获取和状态管理逻辑,以与这些 API 端点交互并相应地更新 UI。

Tabnine 可以通过以下方式加速此过程,而不是手动编写此代码:

  • 为后端生成 Prisma 的 createreadupdatedelete 操作,以及为前端生成 UI 组件。
  • 自动完成函数名称和参数类型。
  • 在遵循使用 DTO、错误处理、一致的 API 设计等最佳实践的同时编写样板代码。

示例:使用 Next.js 生成 CRUD 功能

提示

根据上述模式中的 User 模型,为 Next.js 应用程序生成 CRUD 功能。

生成代码

API 端点
文件名=app/api/users/routes.ts
import { NextResponse } from 'next/server';
import prisma from '../../../lib/prisma';

export async function GET() {
const users = await prisma.user.findMany({
include: { organization: true },
});
return NextResponse.json(users);
}

export async function POST(request: Request) {
const body = await request.json();
const user = await prisma.user.create({
data: {
email: body.email,
name: body.name,
organization: {
connect: { id: body.organizationId },
},
},
include: { organization: true },
});
return NextResponse.json(user);
}

export async function PUT(request: Request) {
const body = await request.json();
const user = await prisma.user.update({
where: { id: body.id },
data: {
email: body.email,
name: body.name,
organizationId: body.organizationId,
},
include: { organization: true },
});
return NextResponse.json(user);
}

export async function DELETE(request: Request) {
const { searchParams } = new URL(request.url);
const id = searchParams.get('id');
const user = await prisma.user.delete({
where: { id: Number(id) },
});
return NextResponse.json(user);
}
React 组件
文件名=app/components/User.tsx
import React, { useState, useEffect } from 'react';

interface User {
id: number;
email: string;
name: string;
organizationId: number;
}

const User: React.FC = () => {
const [users, setUsers] = useState<User[]>([]);
const [newUser, setNewUser] = useState({ email: '', name: '', organizationId: 0 });

useEffect(() => {
fetchUsers();
}, []);

const fetchUsers = async () => {
const response = await fetch('/api/users');
const data = await response.json();
setUsers(data);
};

const createUser = async () => {
await fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(newUser),
});
fetchUsers();
setNewUser({ email: '', name: '', organizationId: 0 });
};

const deleteUser = async (id: number) => {
await fetch(`/api/users?id=${id}`, { method: 'DELETE' });
fetchUsers();
};

return (
<div>
<h2>Users</h2>
<ul>
{users.map((user) => (
<li key={user.id}>
{user.name} ({user.email}) - Org ID: {user.organizationId}
<button onClick={() => deleteUser(user.id)}>Delete</button>
</li>
))}
</ul>
<h3>Create New User</h3>
<input
type="text"
placeholder="Name"
value={newUser.name}
onChange={(e) => setNewUser({ ...newUser, name: e.target.value })}
/>
<input
type="email"
placeholder="Email"
value={newUser.email}
onChange={(e) => setNewUser({ ...newUser, email: e.target.value })}
/>
<input
type="number"
placeholder="Organization ID"
value={newUser.organizationId}
onChange={(e) => setNewUser({ ...newUser, organizationId: Number(e.target.value) })}
/>
<button onClick={createUser}>Create User</button>
</div>
);
};

export default User;

生成用于 TypedSQL 的纯 SQL 查询

Tabnine 如何提供帮助

虽然 Prisma 提供了一个高级 API 用于查询,但有时开发者可能需要降级到原始 SQL 以实现对查询的更底层控制。在这些情况下,他们可以使用 TypedSQL,它为 Prisma ORM 中的原始 SQL 查询提供了完全的类型安全。

一个常见的用例是聚合查询,例如计算上述模式示例中不同订阅状态的百分比。

Tabnine 可以通过以下方式提供帮助:

  • 根据您的 Prisma 模式生成 SQL 查询。
  • 无需手动试错即可构建复杂的聚合。
  • 将查询集成到您的应用程序代码中。

示例:计算活动、过期和暂停订阅的百分比

提示

生成一个 SQL 查询,返回活动、暂停和过期订阅的百分比。

生成的 SQL 查询

prisma/sql/subscriptionsReport.sql
SELECT 
status,
COUNT(*) * 100.0 / (SELECT COUNT(*) FROM "Subscription") AS percentage
FROM "Subscription"
GROUP BY status;

应用程序代码

import { PrismaClient } from '../prisma/generated/client'
import { subscriptionsReport } from '../prisma/generated/client/sql'

const prisma = new PrismaClient();

const usersWithPostCounts = await prisma.$queryRawTyped(subscriptionsReport())
console.log(usersWithPostCounts)

生成单元测试和集成测试的代码

Tabnine 如何提供帮助

编写测试可确保基于 Prisma 的应用程序正常运行并符合要求和预期。然而,编写测试是一项耗时的工作,通常遵循可预测和重复的模式。

Tabnine 可以通过以下方式大大加快测试编写速度:

  • 为单元测试和集成测试生成测试样板。
  • 为 Prisma 数据库交互建议模拟和固定数据。
  • 帮助构建测试用例以遵循最佳实践。
  • 为使用真实或内存数据库测试 Prisma 提供集成测试脚手架。

示例:为 Prisma 服务编写单元测试

提示

为获取所有活动用户的 Prisma 服务函数生成 Jest 单元测试。

生成代码

文件名=__tests__/userService.test.ts
import { prismaMock } from '../prisma/singleton';
import { getActiveUsers } from '../services/userService';

test('should return only active users', async () => {
prismaMock.user.findMany.mockResolvedValue([
{ id: 1, name: 'Alice', email: 'alice@example.com' },
{ id: 2, name: 'Bob', email: 'bob@example.com' }
]);

const users = await getActiveUsers();
expect(users).toHaveLength(2);
expect(users[0].email).toBe('alice@example.com');
});

指导重大重构

Tabnine 如何提供帮助

得益于 Prisma ORM 的类型安全查询,重构比使用其他 ORM 更安全、更可预测:在进行模式更改后,生成的 Prisma Client 代码将更新,并且 TypeScript 编译器将突出显示所有需要更改的地方。

然而,在重构过程中仍然可能出现更困难的情况,例如当业务逻辑或复杂查询需要调整时。

Tabnine 可以在重构期间提供帮助,方法是:

  • 识别代码中的模式并建议重构,同时保持一致性。
  • 帮助在模式更改后更新数据库查询并减少手动工作。
  • 提供函数重写以简化和优化逻辑。
  • 建议需要在整个代码库中处理的破坏性更改。

示例:在模式更改后重构 Prisma 查询

提示

重构此 Prisma 查询以支持使用 User 模型中的 deletedAt 时间戳字段进行软删除。

初始代码

const users = await prisma.user.findMany();

重构代码

const users = await prisma.user.findMany({
where: { deletedAt: null }
});

生成种子脚本

Tabnine 如何提供帮助

使用真实的测试数据为数据库填充数据可能很麻烦。真实的种子数据在开发过程中很有用,因为它可以让开发者更好地了解应用程序在实际使用中的情况。Tabnine 可以通过以下方式帮助进行数据库填充:

  • 根据模式和特定要求生成具有结构化种子数据的脚本。
  • 创建看起来真实的占位符数据,可用于测试应用程序。
  • 生成特定数据以涵盖边缘情况。

示例:创建种子脚本

提示

为填充 User、Organization 和 Subscription 模型生成 Prisma 种子脚本。

生成代码

import { PrismaClient } from "../prisma/generated/client";

const prisma = new PrismaClient();

async function main() {
await prisma.organization.create({
data: {
name: "Prisma Corp",
slug: "prisma-corp",
subscription: {
create: {
plan: "PRO",
status: "ACTIVE"
}
},
users: {
create: [
{ name: "Alice Doe", email: "alice@prisma.io" },
{ name: "Bob Smith", email: "bob@prisma.io" }
]
}
}
});

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 构建应用程序。如果您在允许安装 Prisma VS Code 扩展的编辑器中使用 Tabnine,并且您正在使用 Prisma Postgres,您应该使用它。该扩展提供了一个专用的 UI,用于管理本地和远程 Prisma Postgres 实例,从而可以轻松查看、创建和删除实例,将本地数据库推送到云端,并可视化您的模式。

数据库管理 UI

借助其内置的数据库管理界面,Prisma VS Code 扩展让您可以轻松地在编辑器中处理本地和远程 Prisma Postgres 实例。

工作流

此 UI 支持以下工作流:

  • 使用以下方式进行身份验证:
  • 查看、创建和删除 Prisma Postgres 实例(本地和远程)
  • “推送到云端”:轻松部署本地 Prisma Postgres 实例
  • 通过嵌入式Prisma Studio查看和编辑数据
  • 可视化您的数据库schema

用法

通过 Prisma VS Code 扩展中的 UI 管理 Prisma Postgres 实例

  1. 确保您已安装最新版本的 Prisma VS Code 扩展
  2. 活动栏中找到 Prisma 徽标。
  3. 点击登录以开始按钮。
  4. 使用以下方式进行身份验证:使用登录提示,然后选择一个目标工作区

Prisma Studio 内置

除了管理数据库实例之外,Prisma VS Code 扩展还将 Prisma Studio 直接嵌入到您的编辑器中,使您可以在 Windsurf 中轻松地对数据库执行创建、更新和删除操作。请按照这些简单步骤开始使用。


与 Prisma 保持联系

通过以下方式与我们保持联系,继续你的 Prisma 之旅: 我们的活跃社区。保持信息灵通,参与其中,并与其他开发人员协作。

我们真诚地感谢你的参与,并期待你成为我们社区的一部分!

© . This site is unofficial and not affiliated with Prisma Data, Inc.