Я использую Nest JS, TypeORM и MySQL для создания веб-приложения.
Я использую файл .env
для передачи некоторых переменных среды для подключения к моей локальной базе данных. Синхронизация установлена на true
.
app.module.ts
@Module({
imports: [
ConfigModule.forRoot({ envFilePath: '.env' }),
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useFactory: (configService: ConfigService) => ({
type: 'mysql',
host: configService.get('TYPEORM_HOST'),
port: configService.get('TYPEORM_PORT'),
username: configService.get('TYPEORM_USERNAME'),
password: configService.get('TYPEORM_PASSWORD'),
database: configService.get('TYPEORM_DATABASE'),
autoLoadEntities: true,
synchronize: configService.get('TYPEORM_SYNCHRONIZE'),
}),
inject: [ConfigService],
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {
constructor(private connection: Connection) {}
}
Кроме того, у меня есть модуль Users, который импортирует объект пользователя.
users.module.ts
import { User } from './Entities/User.entity';
@Module({
imports: [TypeOrmModule.forFeature(
[User]
)],
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule { }
User.entity.ts
@Entity({ name: "Users"})
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
userName: string;
@Column()
firstName: string;
@Column()
lastName: string;
@Column()
email: string;
}
Предположим, моя база данных пуста , при первом запуске приложения синхронизация TypeORM автоматически создаст для меня таблицу User с соответствующими столбцами и типами данных. Однако при закрытии приложения и попытке перезапуска я получаю эту ошибку:
[Nest] 14876 - 06/17/2020, 12:37:33 PM [ExceptionHandler] Table 'users' already exists +3ms
QueryFailedError: Table 'users' already exists
at new QueryFailedError (C:\MyProject\Server\node_modules\typeorm\error\QueryFailedError.js:11:28)
at Query.onResult (C:\MyProject\Server\node_modules\typeorm\driver\mysql\MysqlQueryRunner.js:170:45)
at Query.execute (C:\MyProject\Server\node_modules\mysql2\lib\commands\command.js:30:14)
at PoolConnection.handlePacket (C:\MyProject\Server\node_modules\mysql2\lib\connection.js:417:32)
at PacketParser.onPacket C:\MyProject\Server\node_modules\mysql2\lib\connection.js:75:12)
at PacketParser.executeStart (C:\MyProject\Server\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.<anonymous> (C:\MyProject\Server\node_modules\mysql2\lib\connection.js:82:25)
at Socket.emit (events.js:315:20)
at addChunk (_stream_readable.js:302:12)
at readableAddChunk (_stream_readable.js:278:9)
Если я затем выключу синхронизацию и снова запустил ее, я получаю ту же ошибку. Мой единственный обходной путь - отбросить таблицу users
, снова включить синхронизацию, чтобы воссоздать ее, а затем снова выключить. Есть ли причина, по которой TypeORM пытается воссоздать уже существующую таблицу? Для простоты использования я бы не хотел постоянно помнить о переключении синхронизации каждый раз.