0
点赞
收藏
分享

微信扫一扫

TypeORM 的同步选项

配置 TypeORM 连接到数据库时,有一个 synchronize 选项,意思是“同步”,也就是同步 TypeORM 实体和数据表,再详细讲就是根据实体自动创建和修改数据表结构,使其与 TypeORM 定义的实体类相匹配。以 Nest 中的使用为例:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';


@Module({
  imports: [
    // 注册 TypeORM 模块
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root123',
      database: 'nest',
      entities: [ './entites/*.entity.ts'],
      // 同步
      synchronize: true,
    })
  ]
})
export class AppModule {}

具体来说,synchronize 选项可以做以下几件事情:

  1. 如果数据库中不存在与 TypeORM 实体类对应的数据表,则会自动创建相应的数据表。
  2. 如果数据库中已经存在数据表,但其结构与 TypeORM 实体类不匹配,则会自动对数据表进行修改,使其与实体类相匹配。
  3. 如果数据库中已经存在数据表,并且其结构与 TypeORM 实体类完全一致,则不会做任何操作。

上面的场景1和场景3都很美好,可以帮助我们自动同步数据库结构和实体类定义,避免手动修改数据库结构的繁琐过程,同时也可以避免在修改实体类定义时出现数据结构不匹配的问题。但是场景2,就不那么美好了。假如数据表已经存在了数据,此时再对实体类进行修改,比如删除了一个属性,那么数据表中对应的字段也会被删除,此时就会造成数据的丢失。

因此,synchronize 选项的作用在开发和调试时非常有用。如果是在生产环境中,就建议不要开启 synchronize 选项了,生产环境中的自动同步可能会导致数据的丢失或损坏,此时应该手动创建和修改数据库结构。

在另一个 ORM 工具 Sequelize 中,也有一个类似的同步功能,叫做 sync 方法,它通过 sequelize 实例调用。它比 TypeORM 的 synchronize更为激进,比如开启强制同步时:

sequelize.sync({
    force: true
})

它会直接删除数据表,再根据模型重新创建数据表,后果就是整张表的数据都没有了。在使用Sequelize 时一定要格外小心。

小结

本文介绍了 TypeORM 中的 synchronize 选项,主要用来在开发阶段方便同步实体和数据表,能带来很大的便利性,在生产阶段要慎用。

举报

相关推荐

0 条评论