TypeORM实战总结 从踩坑到高效使用的关键技术分享

司空小菊 安全 阅读 1,810
赞 70 收藏
二维码
手机扫码查看
反馈

先看效果,再看代码

最近在项目里用了TypeORM,感觉挺不错的。TypeORM是一个ORM(对象关系映射)库,支持多种数据库,比如MySQL、PostgreSQL等。它的好处是能把数据库操作变得简单,直接用JavaScript/TypeScript来写SQL语句。废话不多说,直接上代码。

TypeORM实战总结 从踩坑到高效使用的关键技术分享

核心代码就这几行

假设我们要创建一个简单的用户表,包含id、name和email字段。首先,安装TypeORM:

npm install typeorm reflect-metadata

然后配置TypeORM连接数据库。我在项目里用的是MySQL,配置文件ormconfig.json如下:

{
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "root",
  "password": "password",
  "database": "test",
  "synchronize": true,
  "logging": false,
  "entities": ["src/entity/**/*.ts"],
  "migrations": ["src/migration/**/*.ts"],
  "subscribers": ["src/subscriber/**/*.ts"]
}

接下来是实体类User.ts

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

最后,我们可以在服务里使用这个实体类进行数据库操作。比如插入一个新用户:

import { createConnection, getRepository } from 'typeorm';
import { User } from './entity/User';

async function createUser() {
  const connection = await createConnection();
  const userRepository = getRepository(User);

  const user = new User();
  user.name = 'John Doe';
  user.email = 'john.doe@example.com';

  await userRepository.save(user);
  console.log('User has been saved');
}

createUser().catch(error => console.log(error));

这个场景最好用

TypeORM特别适合那些需要频繁与数据库交互的项目。比如后台管理系统,或者需要存储大量用户数据的应用。它的优势在于可以把复杂的SQL语句封装成简单的方法调用,大大减少了出错的概率。

踩坑提醒:这三点一定注意

用TypeORM的时候,我踩过几个坑,这里给大家提个醒:

  • 同步模式的问题: 配置文件里的synchronize选项默认是false,如果你把它设置为true,每次运行应用时都会自动同步数据库结构。虽然方便,但可能会导致生产环境的数据丢失。建议只在开发环境使用,生产环境还是手动管理数据库迁移。
  • 类型转换问题: TypeORM会自动处理类型转换,但有时候会出现一些奇怪的问题。比如日期类型,如果数据库里是datetime,而你的实体类里是string,可能会导致时间格式不一致。建议尽量保持类型一致。
  • 性能问题: 大量数据查询时,TypeORM的性能可能不如原生SQL。如果你的应用对性能要求很高,建议结合原生SQL一起使用。TypeORM也支持自定义查询,可以用queryBuilder来写复杂查询。

高级技巧:批量插入和更新

有时候我们需要批量插入或更新数据,TypeORM提供了几种方法来实现这一点。比如批量插入:

import { createConnection, getRepository } from 'typeorm';
import { User } from './entity/User';

async function bulkInsertUsers() {
  const connection = await createConnection();
  const userRepository = getRepository(User);

  const users = [
    { name: 'Alice', email: 'alice@example.com' },
    { name: 'Bob', email: 'bob@example.com' },
    { name: 'Charlie', email: 'charlie@example.com' }
  ];

  await userRepository.save(users);
  console.log('Users have been saved');
}

bulkInsertUsers().catch(error => console.log(error));

批量更新稍微复杂一点,可以用update方法结合条件来实现:

import { createConnection, getRepository } from 'typeorm';
import { User } from './entity/User';

async function bulkUpdateUsers() {
  const connection = await createConnection();
  const userRepository = getRepository(User);

  const usersToUpdate = [
    { id: 1, name: 'Alice Smith' },
    { id: 2, name: 'Bob Johnson' },
    { id: 3, name: 'Charlie Brown' }
  ];

  for (const user of usersToUpdate) {
    await userRepository.update(user.id, { name: user.name });
  }

  console.log('Users have been updated');
}

bulkUpdateUsers().catch(error => console.log(error));

结尾:拓展用法还有很多

以上是我个人对TypeORM的一些实战经验分享,希望能帮到你。TypeORM的功能远不止这些,还有很多高级用法,比如事务管理、监听器、分页查询等等。后续我会继续分享这类博客,希望对你有帮助。

如果有更好的实现方式或者遇到什么问题,欢迎评论区交流。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论
UX-篷蔚
UX-篷蔚 Lv1
作者的分享让我学会了如何更好地平衡代码的可读性和性能,提升了代码质量。
点赞 6
2026-02-03 17:25