当前位置: 首页 > 知识库问答 >
问题:

当同步为真时,TypeORM抛出QueryFailedError表在MySQL上已经存在

伯君浩
2023-03-14

我使用NestJS,TypeORM和MySQL来构建一个Web应用程序。

我正在使用。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) {}
}

此外,我还有一个用户模块,用于导入用户实体。

用户。单元ts

import { User } from './Entities/User.entity';

@Module({
    imports: [TypeOrmModule.forFeature(
        [User]
    )],
    controllers: [UsersController],
    providers: [UsersService],
})
export class UsersModule { }

你ser.entity.ts

@Entity({ name: "Users"})
export class User {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    userName: string;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    email: string;
}

假设我的数据库是空的,当第一次启动应用程序时,TypeORM同步将自动为我创建具有适当列和数据类型的用户表。但是,在关闭应用程序并尝试重新启动时,出现以下错误:

[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试图重新创建一个已经存在的表有什么原因吗?为了便于使用,我不希望每次都记得切换同步。

共有3个答案

唐兴思
2023-03-14

我有类似的问题,我最终解决了它,我发现我把同步设置为false,然后是true,并做了一些测试,创建/生成了保持同步为真的迁移。我还生成了一些迁移,但没有应用。后来我将同步设置为false,当我尝试应用迁移时,它给我错误,就像你提到的那样。我认为未应用的成堆生成迁移给了我问题。

因此,对我来说,解决问题的方法是删除所有迁移文件,然后重新生成迁移并应用该迁移。这就解决了问题。

百里骏
2023-03-14

我也有同样的问题,但我只是在我的或mconfig中将migrationrun设置为false。ts文件,它工作了。

synchronize: false,
migrationsRun: false,

我认为这个问题是由于orm试图自动运行迁移,而我们已经手动完成了迁移。

凌昕
2023-03-14

就我而言,问题是由

  synchronize: true
  migrationsRun: true

在里面

typeOrmConfig

应仅将synchronize或MigrationRun设置为true,而不是同时将两者设置为true

 类似资料:
  • 当我设置typeORM我得到一个错误,但当我使我没有得到那个错误。但是我需要使用来获取数据库更改。有办法解决这个问题吗?

  • 我有一个由多个线程操作的ArrayList,由于ArrayList没有同步,所以无法工作。按照教授的指示,我把列表换成了向量。向量是同步的,但我抛出了与同步相关的异常。 为什么会发生这种情况,我如何避免代码中的并发异常?我不想只是玩玩,直到有东西起作用,我想做最好的事情。谢谢! 例外情况: 代码:

  • 我得到以下错误时使用colspan在我的th标签。 通常,当表单元格的数量在每一行中不相等时,会发生此错误,但情况并非如此。这是我的代码: 下面是codepen中的一个示例:https://codepen.io/anon/pen/EQOVMe?editors=1111 使用jQuery 1.12.3和数据表1.10.16 有什么想法吗?

  • 我期望这段代码(在对细化类型使用模式匹配后调用匿名类的方法) 要打印 (以及未经检查的警告)。 我知道由于类型擦除,匹配总是成功的,但这不应该导致问题,因为的运行时类型(甚至考虑擦除)应该是

  • 问题内容: 我一直在尝试hibernate,Spring和Servlet。现在,我被卡住了。为什么会出现此异常?我认为将hbm2ddl.auto设置为create时会自动创建表。 appicationContext.xml UserDetails.java Main.java 例外 问题答案: 属性名称应以hibernate作为前缀。 顺便说一句,有一种更简单的方法来配置属性,如下所示

  • 问题内容: 我要添加此表: 我得到了1050个“表已经存在” 但是该表不存在。有任何想法吗? 编辑:更多细节,因为每个人似乎都不相信我:) 产量: 1146-表’gunzfact_vbforumdb.contenttype’不存在 和 产量: 1050-表“ contenttype”已存在 问题答案: 听起来好像您有Schroedinger的桌子 … 严重的是,现在您的表可能已损坏。尝试: 如果您