在 TypeScript 中处理数据库:面向初学者的 PostgreSQL 和 MongoDB
TypeScript 是 JavaScript 的强类型超集,它为代码增加了可靠性和可预测性。在处理数据库时,TypeScript 特别有用:您可以为实体定义类型,在编译阶段检查查询的正确性,并避免许多运行时错误。在本文中,我们将探讨如何连接到两种最流行的数据库——关系型 PostgreSQL 和文档型 MongoDB——并执行基本的数据操作。本材料面向熟悉 TypeScript 基础的初学者开发者。
环境准备与依赖安装
在编写代码之前,需要先配置项目。创建一个新目录并初始化项目:
mkdir ts-db-examplecd ts-db-examplenpm init -ynpm install typescript @types/node ts-node --save-devnpx tsc --init现在安装用于处理数据库的库。对于 PostgreSQL,我们将使用 TypeORM(一个流行的、对 TypeScript 有良好支持的 ORM);对于 MongoDB,则使用 Mongoose(一个用于模式建模和操作 MongoDB 的库)。
npm install typeorm reflect-metadata pgnpm install mongoose同时安装 Node.js 的类型定义以及 TypeORM 的配置:
npm install @types/node --save-dev在 tsconfig.json 文件中,务必启用以下选项:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true }}现在项目结构已准备就绪。创建 src 文件夹,并在其中创建用于处理每个数据库的文件。
通过 TypeORM 使用 PostgreSQL
配置连接
TypeORM 允许通过装饰器和实体来处理数据库。创建文件 src/postgres.ts 并配置到本地 PostgreSQL 数据库 ts_db 的连接:
import "reflect-metadata";import { DataSource } from "typeorm";
export const AppDataSource = new DataSource({ type: "postgres", host: "localhost", port: 5432, username: "postgres", password: "password", database: "ts_db", synchronize: true, // 自动创建表(仅用于开发环境) logging: false, entities: ["src/entity/**/*.ts"],});创建实体
实体是一个类,它映射到数据库中的表。创建文件夹 src/entity 和文件 User.ts:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column({ length: 100 }) name: string;
@Column({ unique: true }) email: string;
@Column({ default: 18 }) age: number;}执行 CRUD 操作
现在在文件 src/postgres-crud.ts 中编写用于创建、读取、更新和删除用户的函数:
import { AppDataSource } from "./postgres";import { User } from "./entity/User";
async function main() { await AppDataSource.initialize(); const userRepository = AppDataSource.getRepository(User);
// CREATE — 创建新用户 const newUser = userRepository.create({ name: "伊万·彼得罗夫", email: "ivan@example.com", age: 25, }); await userRepository.save(newUser); console.log("用户已创建:", newUser);
// READ — 读取所有用户 const allUsers = await userRepository.find(); console.log("所有用户:", allUsers);
// UPDATE — 更新 id=1 用户的年龄 const userToUpdate =
```