NestJS中使用Mikro-Orm操作SQLite仅生成库文件不创建数据表问题
问题排查及解决方案
核心问题1:未配置自动建表规则
MikroORM 默认不会自动根据实体类生成数据表,两种处理方式:
- 开发环境直接开启自动同步schema:在
MikroOrmModule.forRoot配置中新增autoSchemaSync: true即可,启动项目时会自动对比实体和表结构,缺失的表会自动创建 - 生产环境建议使用官方迁移工具生成表结构,避免数据丢失
核心问题2:实体持久化方法调用错误
你当前调用的this.taskRepository.create()仅会在内存中生成实体实例,不会执行任何数据库写入操作,必须调用持久化方法才会触发数据库交互,修改create方法如下:
async create(createTaskDto: CreateTaskDto) { console.log(createTaskDto.name); const task = this.taskRepository.create({ ...createTaskDto }); // 执行持久化写入数据库 await this.taskRepository.persistAndFlush(task); return task; }
可选优化:实体路径配置优化
你当前写的实体路径如果匹配不到编译后的实体文件也会导致不建表,可以开启Nest集成的自动实体加载功能,替换手动写的路径配置:
MikroOrmModule.forRoot({ autoLoadEntities: true, // 自动加载所有forFeature注册的实体 dbName: 'sandbox.sqlite3', type: 'sqlite', autoSchemaSync: true, // 开发环境开启自动同步表 debug: true // 可选,开启调试日志可以看到SQL执行语句,方便排查问题 })
其他注意事项
- 如果你使用的是MikroORM v6版本,
autoSchemaSync配置已更名为ensureDatabase,按对应版本配置即可 - 所有写操作(更新、删除)都需要调用flush相关方法才会真正写入数据库,你注释的更新、删除方法也需要补全对应持久化逻辑
内容的提问来源于stack exchange,提问作者Arbaz Irshad
相关产品推荐
相关产品推荐

