TypeORM:已存在用户实体数据时,能否为新增的一对一关联Usage实体预填充默认值?
能否为Usage数据表预填充关联User的默认值数据?
当然可以做到!结合你使用的TypeORM,有几种简单的方式来给Usage表预填充和现有User关联的默认值数据,下面给你两种实用方案:
方案一:使用TypeORM迁移脚本
迁移脚本是TypeORM官方推荐的修改数据库结构、批量操作数据的方式,非常适合这种一次性批量生成关联数据的场景:
创建迁移文件
运行以下命令生成新的迁移文件:typeorm migration:create src/migrations/SeedInitialUsages编写迁移逻辑
打开生成的迁移文件,在up方法里实现查询所有User并创建对应Usage的逻辑:import { MigrationInterface, QueryRunner } from "typeorm"; import { User } from "../entities/User"; import { Usage } from "../entities/Usage"; export class SeedInitialUsages1620000000000 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise<void> { // 查询所有已存在的User数据 const users = await queryRunner.manager.find(User); // 为每个User创建对应的Usage记录,views自动使用默认值0 const usages = users.map(user => { const usage = new Usage(); usage.user = user; // 注意:你的Usage实体里属性名建议改为小写user,符合TS规范 return usage; }); // 批量插入到数据库 await queryRunner.manager.save(usages); } public async down(queryRunner: QueryRunner): Promise<void> { // 回滚时删除所有Usage记录 await queryRunner.manager.delete(Usage, {}); } }运行迁移
执行命令让迁移生效:typeorm migration:run
方案二:使用独立种子数据脚本
如果你的项目有专门的种子数据流程,也可以写一个独立脚本完成填充:
// src/seeds/seed-usages.ts import { createConnection } from "typeorm"; import { User } from "../entities/User"; import { Usage } from "../entities/Usage"; async function seedUsages() { const connection = await createConnection(); const users = await connection.manager.find(User); const usages = users.map(user => { const usage = new Usage(); usage.user = user; return usage; }); await connection.manager.save(usages); await connection.close(); console.log("Usage数据预填充完成!"); } seedUsages().catch(err => console.error(err));
然后直接运行这个脚本即可:
ts-node src/seeds/seed-usages.ts
小提示
注意你的Usage实体里的关联属性名是大写的User,这不符合TypeScript的命名规范(通常用小写驼峰user),建议修改一下,避免后续出现不必要的问题:
@Entity() export class Usage { // ...其他属性 @OneToOne(() => User) @JoinColumn() user: User; // 改为小写user }
内容的提问来源于stack exchange,提问作者Zargham Khan
相关产品推荐
相关产品推荐

