TypeORM выдает QueryFailedError Таблица уже существует на MySQL, когда синхронизация истинна - PullRequest
0 голосов
/ 17 июня 2020

Я использую 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 пытается воссоздать уже существующую таблицу? Для простоты использования я бы не хотел постоянно помнить о переключении синхронизации каждый раз.

1 Ответ

0 голосов
/ 18 июня 2020

Давно, но возможная причина могла быть в том, что вы не добавили глобус сущностей? https://typeorm.io/# / using-ormconfig / using-environment-variables

  entities: '*.entity.ts',

Я думаю, что это должно устранить проблемы, поскольку это создаст карту сущностей. Если нет, попробуйте удалить таблицу, позвольте ей создать ее, а затем повторите попытку syn c?

...