在 TypeScript 中使用数据库:PostgreSQL 与 MongoDB

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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-dev


2. 通过 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 init


2.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

博客

书籍推荐