什么是 TypeORM 以及为什么需要它?
TypeORM 是一个用于 TypeScript 和 JavaScript 的强大对象关系映射库 (ORM),它支持多种数据库:PostgreSQL、MySQL、MariaDB、SQLite、MS SQL Server、Oracle 和 MongoDB(部分支持)。它通过面向对象的方法提供了一种与关系型数据库交互的便捷方式,允许开发人员将表视为类,将记录视为对象。
使用 TypeORM 的主要原因:
- 类型化: 与 TypeScript 完全集成,提供严格的类型检查和 IDE 中的自动补全。
- 声明式方法: 通过装饰器或模式定义数据库模式。
- 自动迁移: 自动创建和同步数据库模式。
- Active Record 和 Data Mapper: 支持两种流行的设计模式。
- 关系支持: 一对一、一对多、多对多。
- 查询构建器: 用于复杂 SQL 查询的灵活查询构建器。
- 跨平台: 适用于 Node.js、浏览器、React Native 和 Ionic。
安装 TypeORM
要安装 TypeORM 和必要的数据库驱动程序,请使用 npm(或 yarn):
// 安装 TypeORMnpm install typeorm --save
// 安装 reflect-metadata(装饰器必需)npm install reflect-metadata --save
// 安装 PostgreSQL 驱动程序npm install pg --save
// 安装 MySQL/MariaDB 驱动程序npm install mysql2 --save
// 安装 SQLite 驱动程序npm install sqlite3 --save
// 安装 SQL Server 驱动程序npm install mssql --save
// 安装 MongoDB 驱动程序(实验性)npm install mongodb --save安装后,在 tsconfig.json 中添加:
{ "compilerOptions": { "emitDecoratorMetadata": true, "experimentalDecorators": true }}快速入门及代码示例
我们将创建一个简单的用户管理应用程序,使用 SQLite(无需安装服务器)。
1. 创建 data-source.ts 文件用于配置连接:
import { DataSource } from "typeorm";import { User } from "./entity/User";
export const AppDataSource = new DataSource({ type: "sqlite", database: "database.sqlite", synchronize: true, logging: true, entities: [User], subscribers: [], migrations: [],});
// 初始化连接AppDataSource.initialize() .then(() => { console.log("数据源已初始化!"); }) .catch((err) => { console.error("数据源初始化期间出错:", err); });2. 在 entity/User.ts 文件中创建 User 实体:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column() firstName: string;
@Column() lastName: string;
@Column({ unique: true }) email: string;
@Column({ default: true }) isActive: boolean;}3. 创建 index.ts 文件用于演示操作:
import "reflect-metadata";import { AppDataSource } from "./data-source";import { User } from "./entity/User";
async function main() { await AppDataSource.initialize();
// 创建一个新用户 const user = new User(); user.firstName = "伊万"; user.lastName = "彼得罗夫"; user.email = "ivan@example.com"; user.isActive = true;
// 保存到数据库 await AppDataSource.manager