---
# System prepended metadata

title: "\U0001F3C5 Day 19 - ORM 與資料庫操作基礎"
tags: [2025 Node.js 後端工程師培訓營]

---

# 🏅 Day 19 - ORM 與資料庫操作基礎


## TypeORM 簡介

TypeORM 是一個流行的 Node.js ORM（Object-Relational Mapping）框架，支援 TypeScript 和 JavaScript。它能幫助開發者透過物件操作的方式與資料庫交互，而不需要直接編寫繁瑣的 SQL 語句。

https://typeorm.io/

## TypeORM 定義資料庫表結構

### 舉例說明：
```js
const CreditPackage = new EntitySchema({
  name: "CreditPackage", // 定義表的名稱（Entity 名稱）
  tableName: "CREDIT_PACKAGE", // 對應資料庫中的表名
  columns: {
    id: {
      primary: true, // 設定為主鍵
      type: "uuid", // 主鍵使用 UUID 格式
      generated: "uuid", // 自動生成 UUID
      nullable: false // 不可為空
    },
    name: {
      type: "varchar", // 欄位類型為 varchar
      length: 50, // 最大長度為 50
      nullable: false, // 不可為空
      unique: true // 必須唯一
    },
    description: {
      type: "text", // 欄位類型為 text
      nullable: true // 可為空
    },
    price: {
      type: "decimal", // 欄位類型為 decimal
      precision: 10, // 數字最大 10 位數
      scale: 2, // 小數點後 2 位
      nullable: false // 不可為空
    },
    createdAt: {
      type: "timestamp", // 欄位類型為時間戳記
      default: () => "CURRENT_TIMESTAMP", // 預設值為當前時間
      nullable: false // 不可為空
    }
  },
  relations: {
    users: {
      type: "many-to-one", // 關聯類型為多對一
      target: "User", // 關聯的目標表
      joinColumn: true // 指定關聯欄位為外鍵
    }
  }
});
```
---
## 題目
請根據以下要求完成 Skill 的 EntitySchema 定義

Skill 表的結構：
1. id：主鍵，uuid 格式，必須自動生成且不可為空。
2. name：名稱，varchar(50)，不可為空且唯一。
3. createdAt：建立時間，timestamp，必須自動填入。

回報區
---
| #   | Discord | CodePen / 答案 |
| ---------------- | -------- |--|
| 1 | 馬德 | [CodePen](https://codepen.io/maywang/pen/GgKbxOK?editors=0010)
|2 | pja._. | [CodePen](https://codepen.io/PJA0103/pen/yyBdvgB?editors=0011)
| 3 | adengg | [CodePen](https://codepen.io/Osases/pen/bNbPMyj?editors=0012)
| 4 | helena | [CodePen](https://codepen.io/helena27/pen/raBEKVa)
| 5 | benson | [CodePen](https://codepen.io/DevilButler/pen/jENjpOW?editors=0010) | 
|  6  | bian_yang_mofa | [CodePen](https://codepen.io/cssf998811/pen/bNbPjzB?editors=0010) | 
|7|janetlai|[Codepen](https://codepen.io/eiddkqxz-the-builder/pen/jENjvGx)
|8|ZoeKang|[CodePen](https://codepen.io/byehywmx-the-animator/pen/JoPQmdK?editors=0010)
| 9 | poyi | [CodePen](https://codepen.io/poyi-the-flexboxer/pen/bNbPQYE?editors=0010) | 
| 10 | Tau | [CodePen](https://codepen.io/Tau-Hsu/pen/LEPKXeX?editors=0010) | 
| 11 | sian | [CodePen](https://codepen.io/uxitysjl-the-flexboxer/pen/MYgMZKX?editors=0010) | 
| 12 | Tammy | [CodePen](https://codepen.io/Tammy_Tsai/pen/ByBgvBQ) | 
| 13 | JanllyGuo | [CodePen](https://codepen.io/kedugaw/pen/OPLeeMe?editors=0010) | 
| 14 | ss585801 | [CodePen](https://codepen.io/ss585801/pen/yyBxBde?editors=0010) | 
| 15 | Heidi | [CodePen](https://codepen.io/Heidi-Hsiao/pen/bNbXBjZ?editors=0010)
| 16 | hananhpun | [CodePen](https://codepen.io/hannahpun/pen/EaYqGdz) | 
| 17 | JC | [CodePen](https://codepen.io/lifetimingwhisper/pen/QwLeYEZ) | 
| 18    |   daffytseng    | [CodePen](https://codepen.io/Daffy-Tseng/pen/YPzKYKg)|
| 19    |   sui_hsilan    | [CodePen](https://codepen.io/suihsilan/pen/myddyjJ?editors=0010) | 
| 20 | hsin yu | [CodePen](https://codepen.io/tina2793778/pen/ogNNXVB) | 
| 21 | HarryKuo | [CodePen](https://codepen.io/harry_kuo/pen/pvooJmm?editors=0010)|
| 22. |  地呱  | [Codepen](https://codepen.io/wiibxzdw-the-bold/pen/azbzBXo?editors=0010) |
| 23. |  yutzu  | [Codepen](https://codepen.io/dtafsrmf-the-lessful/pen/raNamjq?editors=0010) |
|24.|Lee|[CodePen](https://codepen.io/leemo-tseng/pen/ByaNbOx?editors=0010)|
| 25. | JerryOOO |[CodePen](https://codepen.io/fatiangel/pen/MYWyWGX?editors=0010)|
|26.|wuyuli_21403| [CodePen](https://codepen.io/Job-Wilhelm/pen/qEBjZzz) |
|27.|shiang| [CodePen](https://codepen.io/shiang29/pen/ByaYNKY?editors=0010) |


<!-- 可複製下方格式
|     |       | [CodePen]() | 


-->

<!--
```解答
const Skill = new EntitySchema({
  name: "Skill",
  tableName: "SKILL",
  columns: {
    id: {
      primary: true,
      type: "uuid",
      generated: "uuid",
      nullable: false
    },
    name: {
      type: "varchar",
      length: 50,
      nullable: false,
      unique: true
    },
    createdAt: {
      type: "timestamp",
      createDate: true,
      name: "created_at",
      nullable: false
    }
  }
})
```
-->