配置 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
选项可以做以下几件事情:
- 如果数据库中不存在与 TypeORM 实体类对应的数据表,则会自动创建相应的数据表。
- 如果数据库中已经存在数据表,但其结构与 TypeORM 实体类不匹配,则会自动对数据表进行修改,使其与实体类相匹配。
- 如果数据库中已经存在数据表,并且其结构与 TypeORM 实体类完全一致,则不会做任何操作。
上面的场景1和场景3都很美好,可以帮助我们自动同步数据库结构和实体类定义,避免手动修改数据库结构的繁琐过程,同时也可以避免在修改实体类定义时出现数据结构不匹配的问题。但是场景2,就不那么美好了。假如数据表已经存在了数据,此时再对实体类进行修改,比如删除了一个属性,那么数据表中对应的字段也会被删除,此时就会造成数据的丢失。
因此,synchronize
选项的作用在开发和调试时非常有用。如果是在生产环境中,就建议不要开启 synchronize
选项了,生产环境中的自动同步可能会导致数据的丢失或损坏,此时应该手动创建和修改数据库结构。
在另一个 ORM 工具 Sequelize 中,也有一个类似的同步功能,叫做 sync
方法,它通过 sequelize 实例调用。它比 TypeORM 的 synchronize
更为激进,比如开启强制同步时:
sequelize.sync({
force: true
})
它会直接删除数据表,再根据模型重新创建数据表,后果就是整张表的数据都没有了。在使用Sequelize 时一定要格外小心。
小结
本文介绍了 TypeORM 中的 synchronize
选项,主要用来在开发阶段方便同步实体和数据表,能带来很大的便利性,在生产阶段要慎用。