介绍
TypeORM 是一个强大的 ORM(对象关系映射)框架,它支持多种数据库,如 MySQL、PostgreSQL、SQLite、Oracle 等。使用 TypeORM 可以让我们更方便地操作数据库,并且不用去手动写 SQL 语句,从而提高开发效率。
在 TypeScript 中使用 TypeORM 可以获得类型检查的优势,让我们更容易地发现代码错误,并且在代码复杂度增加时也更容易维护。
本文将介绍如何在 TypeScript 项目中使用 TypeORM,并且提供一些最佳实践和示例代码。
安装
要在 TypeScript 项目中使用 TypeORM,需要先安装这两个包:
npm install typeorm reflect-metadata
其中 reflect-metadata 是必需的,因为 TypeORM 使用装饰器来定义实体和字段映射关系,而这些装饰器需要 reflect-metadata 支持。
配置
TypeORM 的配置文件最常见的是 ormconfig.js,但是在 TypeScript 项目中,我们可以使用 ormconfig.ts 来获得类型检查的好处。
以下是一个示例配置文件:
// www.javascriptcn.com code example
import { ConnectionOptions } from 'typeorm';
const config: ConnectionOptions = {
type: 'postgres', // 数据库类型
host: 'localhost', // 数据库地址
port: 5432, // 数据库端口
username: 'postgres', // 数据库用户名
password: 'password', // 数据库密码
database: 'mydb', // 数据库名
synchronize: true, // 自动同步数据库结构
logging: false, // 不输出 SQL 日志
entities: ['./src/entities/**/*.ts'], // 实体所在目录,支持 glob 语法
migrations: ['./src/migrations/**/*.ts'], // 数据库迁移所在目录,支持 glob 语法
subscribers: ['./src/subscribers/**/*.ts'], // 事件订阅者所在目录,支持 glob 语法
cli: {
entitiesDir: './src/entities', // 命令行工具,实体所在目录,相对于项目根目录
migrationsDir: './src/migrations', // 命令行工具,数据库迁移所在目录,相对于项目根目录
subscribersDir: './src/subscribers', // 命令行工具,事件订阅者所在目录,相对于项目根目录
},
};
export = config;定义实体
在 TypeORM 中,一个实体代表了一个数据表,实体的属性代表了数据表中的字段。
以下是一个示例实体定义:
// www.javascriptcn.com code example
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity({ name: 'users' }) // 指定该实体对应的数据表名为 users
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
@Column()
password: string;
@Column({ name: 'created_at' })
createdAt: Date;
@Column({ name: 'updated_at' })
updatedAt: Date;
}该实体定义了一个名为 users 的数据表,并且有五个字段:id、name、email、password、createdAt 和 updatedAt。id 字段是主键,createdAt 和 updatedAt 字段使用了 @Column 装饰器中的 name 属性来指定了字段名。
定义关系
在 TypeORM 中,实体之间可以有关系,比如一个用户有多篇文章。以下是一个示例关系定义:
// www.javascriptcn.com code example
import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from 'typeorm';
import { Post } from './post.entity';
@Entity({ name: 'users' })
export class User {
// ...
@OneToMany(() => Post, (post) => post.author)
posts: Post[];
}这里定义了一个 User 实体和 Post 实体之间的一对多关系,意思是一个用户可以有多篇文章,而一篇文章只能有一个作者。
操作数据
在使用 TypeORM 操作数据之前,需要先创建连接,然后通过连接获取实体的仓库,即 Repository。
以下是一个简单的操作数据的示例:
// www.javascriptcn.com code example
import { createConnection } from 'typeorm';
import { User } from './entities/user.entity';
createConnection()
.then(async (connection) => {
const userRepository = connection.getRepository(User);
const newUser = new User();
newUser.name = 'Alice';
newUser.email = 'alice@example.com';
newUser.password = 'password';
newUser.createdAt = new Date();
newUser.updatedAt = new Date();
await userRepository.save(newUser);
console.log(`The new user has been created with id ${newUser.id}`);
})
.catch((error) => console.log(error));这里创建了一个名为 Alice 的用户,并将其保存到数据库中。在 save 方法调用完成后,newUser 对象的 id 属性就会被填充上插入数据库后的值,可以在控制台输出。
最佳实践
- 在
ormconfig.ts中使用类型声明来获得类型检查的好处。 - 使用实体定义数据表的结构,使用字段类型、长度、关系等来约束数据合法性。
- 尽可能使用
async/await来进行操作,避免回调地狱。 - 在操作对象的同时,避免对原始对象造成影响,比如对数组进行修改时不要直接修改原数组,而应该创建并返回一个新数组。
- 将所有的 DB 操作放在单独的文件夹中,按照功能或模块进行划分。
- 使用迁移来管理数据库结构的变化,避免手动操作数据库造成错误。
结论
本文介绍了在 TypeScript 中使用 TypeORM 的教程及最佳实践和示例代码。通过使用 TypeORM,我们可以方便地操作数据库,更容易发现代码错误,在开发过程中提高代码质量和效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66fbd3df4471362601647b86