跳到主要內容

Tabnine

Tabnine 是一個 AI 軟體開發平臺,以 擴充套件 的形式提供給你的 IDE(例如 VS Code、WebStorm、IntelliJ 等)。

概述

它透過以下方式幫助開發者更快地編寫程式碼:

  • 在編輯器中提供上下文感知的 程式碼補全 建議,用於小型重複性編碼任務
  • 提供整合的 聊天 功能,用於更高級別的任務和詳細說明

為什麼將 Prisma ORM 與 Tabnine 結合使用?

Tabnine 等 AI 編輯器是功能強大的工具,可以顯著提高開發人員的生產力。它在以下工作流程中表現尤為出色:

  • 資料建模和資料庫模式設計
  • 構建和最佳化資料庫查詢
  • 生成 CRUD 功能和其他樣板程式碼
  • 生成可與 TypedSQL 一起使用的純 SQL 查詢
  • 生成單元測試和整合測試的程式碼
  • 指導進行重大重構
  • 生成種子指令碼

利用 Prisma Schema

由於 Prisma 擁有自己的 schema,Tabnine 可以理解資料的基本結構,並幫助你為技術棧的其他部分編寫程式碼。

因此,我們建議你首先定義 Prisma schema,然後使用 Tabnine 構建圍繞它的應用層(包括 API 呼叫、DTO、業務邏輯、第三方整合等)。

資料建模和資料庫模式設計

Tabnine 如何提供幫助

從頭開始設計資料庫模式涉及大量樣板程式碼,並且可能非常耗時。

Tabnine 可以透過以下方式加速此過程:

  • 為模型、索引、約束和關係生成樣板程式碼。
  • 透過遵循命名和其他約定來保持模式的一致性。
  • 根據常見的資料庫模式自動完成模型和欄位定義。
  • 根據命名約定建議關係和欄位型別。

示例:定義 Prisma schema

提示

為一個 SaaS 應用定義 Prisma schema,包含 User、Organization 和 Subscription 模型。確保正確設定關係。

生成的程式碼

generator client {
provider = "prisma-client-js"
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

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 可以透過以下方式提供幫助:

  • 根據 schema 自動補全 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 功能

提示

根據上述 schema 中的 User 模型,為 Next.js 應用生成 CRUD 功能。

生成的程式碼

API 端點
filename=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 元件
filename=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 查詢提供了完整的型別安全。

一個常見的用例是聚合查詢,例如在上述 schema 示例中計算不同訂閱狀態的百分比。

Tabnine 可以透過以下方式提供幫助:

  • 根據你的 Prisma schema 生成 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/client'
import { subscriptionsReport } from '@prisma/client/sql'

const prisma = new PrismaClient();

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

生成單元測試和整合測試的程式碼

Tabnine 如何提供幫助

編寫測試可確保基於 Prisma 的應用程式正常執行並符合要求和預期。然而,編寫測試是一項耗時的活動,通常遵循可預測和重複的模式。

Tabnine 可以透過以下方式大大加快編寫測試的速度:

  • 為單元測試和整合測試生成測試樣板。
  • 為 Prisma 資料庫互動建議模擬和固定資料。
  • 幫助構建測試用例以遵循最佳實踐。
  • 提供整合測試腳手架,用於使用真實或記憶體資料庫測試 Prisma。

示例:為 Prisma 服務編寫單元測試

提示

為一個獲取所有活躍使用者的 Prisma 服務函式生成 Jest 單元測試。

生成的程式碼

filename=__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 更安全、可預測:在更改 schema 後,生成的 Prisma Client 程式碼將更新,TypeScript 編譯器將突出顯示所有需要更改的地方。

然而,在重構期間可能仍然存在更困難的情況,例如當業務邏輯或複雜查詢需要調整時。

Tabnine 可以透過以下方式在重構期間提供幫助:

  • 識別程式碼中的模式並建議重構,同時保持一致性。
  • 幫助在 schema 更改後更新資料庫查詢並減少手動工作量。
  • 提供函式重寫以簡化和最佳化邏輯。
  • 建議需要在整個程式碼庫中處理的破壞性更改。

示例:在 schema 更改後重構 Prisma 查詢

提示

重構此 Prisma 查詢以支援軟刪除,在 User 模型中使用 deletedAt 時間戳欄位。

初始程式碼

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

重構後的程式碼

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

生成種子指令碼

Tabnine 如何提供幫助

用真實的測試資料填充資料庫可能很麻煩。真實的種子資料在開發過程中很有幫助,因為它能讓開發者更好地瞭解應用程式在實際使用中的表現。Tabnine 可以透過以下方式幫助進行資料庫填充:

  • 根據 schema 和特定要求生成帶有結構化種子資料的指令碼。
  • 建立可用於測試應用程式的逼真佔位資料。
  • 生成特定資料以覆蓋邊緣情況。

示例:建立種子指令碼

提示

生成一個 Prisma 種子指令碼,用於填充 User、Organization 和 Subscription 模型。

生成的程式碼

import { PrismaClient } from "@prisma/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 保持聯絡

透過以下方式,繼續你的 Prisma 之旅: 我們活躍的社群。隨時瞭解最新資訊,積極參與,並與其他開發者協作

我們真誠地珍視你的參與,並期待你成為我們社群的一員!

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