首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当同步为真时TypeORM抛出QueryFailedError表在MySQL上已经存在

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

Stack Overflow用户
提问于 2020-06-17 17:17:32
回答 22查看 11.6K关注 0票数 7

我正在使用NestJS、TypeORM和MySQL构建一个web应用程序。

我使用一个.env文件来传递一些环境变量,以便连接到本地数据库。同步设置为true

app.module.ts

代码语言:javascript
运行
复制
@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.module.ts

代码语言:javascript
运行
复制
import { User } from './Entities/User.entity';

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

User.entity.ts

代码语言:javascript
运行
复制
@Entity({ name: "Users"})
export class User {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    userName: string;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    email: string;
}

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

代码语言:javascript
运行
复制
[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试图重新创建一个已经存在的表?为了便于使用,我不想总是记得每次切换同步.

EN

Stack Overflow用户

发布于 2022-03-16 13:11:03

对我来说,解决方案是将TypOrmModule配置中的数据库名称更改为小写,以匹配mysql服务器上创建的模式。

由于某些原因,允许在TypeOrm的第一次设置时进行不同的设置。

票数 3
EN
查看全部 22 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62434734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档