在 TypeScript 中操作数据库:PostgreSQL 和 MongoDB
TypeScript 是一种强大的编程语言,它为 JavaScript 添加了静态类型支持。在现代 Web 应用程序开发中,数据库操作是不可或缺的一部分。本文将探讨如何利用 TypeScript 高效地操作两种主流数据库——关系型数据库 PostgreSQL 和文档型数据库 MongoDB。
1. 环境准备与 ORM 选择
在开始之前,需要先配置项目。创建一个支持 TypeScript 的 Node.js 新项目:
mkdir ts-database-democd ts-database-demonpm init -ynpm install typescript @types/node ts-node --save-devnpx tsc --init我们将使用以下流行库来操作数据库:
- Prisma — 适用于 PostgreSQL(及其他 SQL 数据库)的现代 ORM
- Mongoose — 适用于 MongoDB 的 ODM,对 TypeScript 有出色支持
安装所需包:
npm install prisma @prisma/client mongoosenpm install @types/mongoose --save-dev2. 通过 Prisma 操作 PostgreSQL
Prisma 是一种 ORM,它能根据数据库模式自动生成 TypeScript 类型,从而提供完整的类型安全性。
2.1. 配置 Prisma
在项目中初始化 Prisma:
npx prisma init在 prisma/schema.prisma 文件中定义数据模型:
generator client { provider = "prisma-client-js"}
datasource db { provider = "postgresql" url = env("DATABASE_URL")}
model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt}
model Post { id Int @id @default(autoincrement()) title String content String? published Boolean @default(false) author User @relation(fields: [authorId], references: [id]) authorId Int createdAt DateTime @default(now()) updatedAt DateTime @updatedAt}创建包含连接字符串的 .env 文件:
DATABASE_URL="postgresql://user:password@localhost:5432/mydb"执行迁移:
npx prisma migrate dev --name init2.2. 使用 TypeScript 进行 CRUD 操作
现在编写类型安全的数据库操作代码。创建 src/postgres.ts 文件:
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
interface CreateUserInput { email: string; name?: string;}
interface CreatePostInput { title: string; content?: string; authorId: number;}
// 创建用户async function createUser(data: CreateUserInput) { return await prisma.user.create({ data: { email: data.email, name: data.name, }, });}
// 获取所有用户及其帖子async function getUsersWithPosts() { return await prisma.user.findMany({ include: { posts: true, }, });}
// 创建帖子async function createPost(data: CreatePostInput) { return await prisma.post.create({ data: { title: data.title, content: data.content, authorId: data.authorId, }, });}
// 更新用户async function updateUser(id: number, data: Partial<CreateUserInput>) { return await prisma.user.update({ where: { id }, data, });}
// 删除用户async function deleteUser(id: number) { return await prisma.user.delete({ where: { id }, });}
// 使用示例(async () => { try { const user = await createUser({ email: 'ivan@example.com', n