[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EGFSKWCAF0Z3ECXKBSB313":3,"skill-same:01M6EGFSKWCAF0Z3ECXKBSB313":45},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":20,"frontMatter":21,"refName":22,"commitSha":23,"skillDirectory":24,"forksCount":25,"repositoryHtmlUrl":26,"repositoryHomepageUrl":27,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6EGFSKWCAF0Z3ECXKBSB313","typeorm",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Ftypeorm\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"# TypeORM — TypeScript ORM for SQL Databases\n\nYou are an expert in TypeORM, the ORM for TypeScript and JavaScript that supports PostgreSQL, MySQL, SQLite, MS SQL, and Oracle. You help developers define entities with decorators, build type-safe queries with QueryBuilder, manage database migrations, handle relations (one-to-one, one-to-many, many-to-many), and use repository patterns for clean data access layers.\n\n## Core Capabilities\n\n### Entity Definition\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn,\n  ManyToOne, OneToMany, ManyToMany, JoinTable, Index, BeforeInsert } from \"typeorm\";\n\n@Entity(\"users\")\nexport class User {\n  @PrimaryGeneratedColumn(\"uuid\")\n  id: string;\n\n  @Column({ length: 100 })\n  name: string;\n\n  @Index({ unique: true })\n  @Column()\n  email: string;\n\n  @Column({ select: false })\n  passwordHash: string;\n\n  @Column({ type: \"enum\", enum: [\"user\", \"admin\"], default: \"user\" })\n  role: \"user\" | \"admin\";\n\n  @Column({ type: \"jsonb\", nullable: true })\n  profile: { bio?: string; avatar?: string };\n\n  @OneToMany(() => Post, (post) => post.author)\n  posts: Post[];\n\n  @ManyToMany(() => Tag)\n  @JoinTable()\n  interests: Tag[];\n\n  @CreateDateColumn()\n  createdAt: Date;\n\n  @UpdateDateColumn()\n  updatedAt: Date;\n\n  @BeforeInsert()\n  normalizeEmail() {\n    this.email = this.email.toLowerCase().trim();\n  }\n}\n\n@Entity(\"posts\")\nexport class Post {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column()\n  title: string;\n\n  @Column({ type: \"text\" })\n  body: string;\n\n  @Column({ default: false })\n  published: boolean;\n\n  @ManyToOne(() => User, (user) => user.posts)\n  author: User;\n\n  @Column()\n  authorId: string;\n\n  @CreateDateColumn()\n  createdAt: Date;\n}\n```\n\n### QueryBuilder\n\n```typescript\n\u002F\u002F Complex queries with type safety\nconst posts = await dataSource\n  .getRepository(Post)\n  .createQueryBuilder(\"post\")\n  .leftJoinAndSelect(\"post.author\", \"author\")\n  .where(\"post.published = :published\", { published: true })\n  .andWhere(\"author.role = :role\", { role: \"admin\" })\n  .orderBy(\"post.createdAt\", \"DESC\")\n  .skip(20)\n  .take(10)\n  .getMany();\n\n\u002F\u002F Subquery\nconst topAuthors = await dataSource\n  .getRepository(User)\n  .createQueryBuilder(\"user\")\n  .addSelect((subQuery) =>\n    subQuery\n      .select(\"COUNT(post.id)\", \"postCount\")\n      .from(Post, \"post\")\n      .where(\"post.authorId = user.id\"),\n    \"postCount\"\n  )\n  .orderBy(\"postCount\", \"DESC\")\n  .limit(10)\n  .getRawMany();\n\n\u002F\u002F Transactions\nawait dataSource.transaction(async (manager) => {\n  const user = manager.create(User, { name: \"Alice\", email: \"alice@example.com\" });\n  await manager.save(user);\n  const post = manager.create(Post, { title: \"First Post\", author: user });\n  await manager.save(post);\n});\n```\n\n### Migrations\n\n```bash\n# Generate migration from entity changes\nnpx typeorm migration:generate src\u002Fmigrations\u002FAddUserProfile -d src\u002Fdata-source.ts\n\n# Run migrations\nnpx typeorm migration:run -d src\u002Fdata-source.ts\n\n# Revert last migration\nnpx typeorm migration:revert -d src\u002Fdata-source.ts\n```\n\n## Installation\n\n```bash\nnpm install typeorm reflect-metadata\nnpm install pg                            # PostgreSQL driver\n# Add to tsconfig.json: \"emitDecoratorMetadata\": true, \"experimentalDecorators\": true\n```\n\n## Best Practices\n\n1. **Migrations over sync** — Never use `synchronize: true` in production; use generated migrations for schema changes\n2. **QueryBuilder for complex queries** — Use repositories for simple CRUD, QueryBuilder for joins\u002Fsubqueries\u002Faggregations\n3. **Select only needed fields** — Use `.select([\"user.id\", \"user.name\"])` to avoid fetching large columns\n4. **Eager vs lazy relations** — Default to lazy; use `leftJoinAndSelect` only when you need the relation\n5. **Transactions for consistency** — Wrap multi-entity operations in `dataSource.transaction()`\n6. **Entity listeners** — Use `@BeforeInsert`, `@BeforeUpdate` for data normalization and validation\n7. **Repository pattern** — Create custom repositories for complex query logic; keeps services clean\n8. **Connection pooling** — Configure `extra: { max: 20 }` in data source options; match your expected concurrency\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Ftypeorm",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill typeorm",{"tool":37,"command":38},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill typeorm",{"tool":40,"command":41},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill typeorm","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Ftypeorm\u002FSKILL.md",true,[],[46,60,70,79,85,92],{"skillNo":47,"name":48,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":49,"categories":50,"keywords":56,"publishedAt":18},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[51],{"categoryNo":52,"categoryName":53,"taxonomyType":54,"taxonomyTypeDesc":55},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[57,58,59],"model","model hierarchy","model hierarchy skill",{"skillNo":61,"name":62,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":66,"publishedAt":18},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[65],{"categoryNo":52,"categoryName":53,"taxonomyType":54,"taxonomyTypeDesc":55},[67,68,69],"MCP","zoom","zoom mcp",{"skillNo":71,"name":72,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":18},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[76,77,78,68],"sdk","zoom apps sdk","apps",{"skillNo":80,"name":81,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":18},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[81],{"skillNo":86,"name":87,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":91,"publishedAt":18},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[90],{"categoryNo":52,"categoryName":53,"taxonomyType":54,"taxonomyTypeDesc":55},[87],{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":18},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[94]]