菜比八寫後端(5) - TypeORM簡介


Posted by TempuraEngineer on 2023-11-05

目錄


ORM是什麼

Object Relational Mapping (ORM)是一種用於建立物件導向程式語言與關聯式資料庫的技術

可以把它視為是幫你把sql語法抽象化、進行包裝

What is an ORM – The Meaning of Object Relational Mapping Database Tools


TypeORM是什麼

TypeORM是一種ORM工具,支援Typescript、Javascript,且可以在Node JS、React Native、瀏覽器等環境運行

優點如下

  • 幫你把語法抽象化,減少寫sql語法,以提升開發速度
  • 關聯式、非關聯式資料庫都支援
  • 捕捉多數的問題(ex: input驗證),


安裝TypeORM

這篇使用TypeORM + MySQL

可以選擇全域或(拆分專案的)本地安裝,只是本地安裝的話使用一些typeorm指令時前面要加npx

如果entity(或者說專案)是用Typescript寫的話還要安裝ts-node

不過其實也不必自己手動,因為可以直接使用指令初始化typeorm專案

初始化指令會幫你產生一些基本的必須檔案(ex: package.json、tsconfig.json、src/index.ts、.gitignore、README.md)

typeorm init --database mysql

初始化後專案結構會長這樣

package.json長這樣,只要根據下方的內容去npm i就行了

reflect-metadata為了要讓裝飾器能正常運作

另外需要去data-source.ts修改username、password、database(MySQL對應schema)之類的設定

至於要填什麼在MySQL workench都可以找到


什麼是entity

entity是一個class,它會map到DB的table,也就是說table裡的所有column都會對應到entity內的屬性

每個entity都必須有一個primary column,且要被註冊到data-source.ts內的DataSource實例的entities屬性

如果漏了這部之後跑ts-node src/index.ts就會遇到No metadata for "entity的名稱" was found.

const AppDataSource = new DataSource({
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "root",
    password: "123456",
    database: "bookInfos",
    synchronize: true,
    logging: false,
    entities: ["./src/entities/*.ts"],
    migrations: [],
    subscribers: [],
})


建立entity

使用以下的指令可以建立一個新的entity

npx typeorm entity:create 放entity的路徑/entity名稱

如果想從DB內的table產生entity也可以安裝typeorm-model-generator

npm i typeorm-model-generator

安裝好後在package.json內新增以下的指令,並執行它,就會可以和table同步了

"sync-entity":"npx typeorm-model-generator -h localhost -d db名稱 -u 使用者名稱 -x 密碼 -e 使用的資料庫 -o 輸出路徑"


使用express來個小例子

記得先安裝express,並確認是否已安裝ts-node、typescript、設定tsconfig.json

Example using TypeORM with Express

不過如果透過typeorm init指另的話,上述除了express都會幫安裝、設定好

npm i express @types/express --save-dev


參考資料

TypeORM - getting started
entities
typeorm-model-generator
Day 17 - 使用指令同步 DB 資料表來生成 Entity(上)


#TypeORM







Related Posts

[Day 0 0]好迷失的被抓來發文

[Day 0 0]好迷失的被抓來發文

Cmder 更改 lambda λ 符號

Cmder 更改 lambda λ 符號

Kotlin 學習社群 - Kotlin Tips

Kotlin 學習社群 - Kotlin Tips


Comments