Skip to main content

migrate-seeder

Nest 是一個用於建立可擴展的 Node.js 應用程序的框架。在 Nest 中,遷移(migration)是一個用於管理數據庫結構變化的工具。下面是一個使用 Nest 遷移的詳細步驟:

首先,確保你已經安裝了 Nest CLI。如果還沒有安裝,可以使用以下命令進行安裝:

npm install -g @nestjs/cli

migrate

  1. 遷移文件將被創建在 src/migrations 目錄下。打開創建的遷移文件,你將看到一個空的類,該類將繼承自 MigrationInterface 接口。在這個類中,你需要實現 updown 方法。up 方法用於定義你要在數據庫中進行的變化,而 down 方法則用於定義如何回滾這些變化。

  2. up 方法中,你可以使用 TypeORM 提供的 API 來創建、修改或刪除數據庫表、列和索引等。以下是一個簡單的例子:

public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(new Table({
name: 'users',
columns: [
{
name: 'id',
type: 'int',
isPrimary: true,
isGenerated: true,
generationStrategy: 'increment',
},
{
name: 'name',
type: 'varchar',
},
{
name: 'age',
type: 'int',
},
],
}));
}
  1. down 方法中,你需要定義如何回滾這些變化。以下是一個簡單的例子:
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable('users');
}
  1. 當你完成了遷移文件的編寫,可以使用以下命令運行遷移:
npm run migration:run

這將自動應用你創建的遷移。

  1. 如果需要回滾遷移,可以使用以下命令:
npm run migration:revert

這將回滾最近應用的遷移。

這就是使用 Nest 遷移的基本步驟。你可以根據你的需求在遷移文件中進行更多的數據庫結構變化操作。

seeder

typeorm-seeding

上次更新 typeorm-seeding 好像比較久以前的事情。

建立 Factory

Factory 是用來生成假數據的函式。我們可以使用 define 方法來定義一個 factory。例如,我們可以建立一個 UserFactory 來生成使用者的假數據。

import { define } from "typeorm-seeding";
import { User } from "../entities/user.entity";

define(User, (faker) => {
const user = new User();
user.name = faker.name.firstName();
user.email = faker.internet.email();
return user;
});

建立 Seeder

Seeder 是用來將假數據插入到資料庫的函式。我們可以使用 FactoryConnection 來建立一個 seeder。例如,我們可以建立一個 CreateUsers seeder 來插入使用者的假數據。

import { Factory, Seeder } from "typeorm-seeding";
import { Connection } from "typeorm";
import { User } from "../entities/user.entity";

export default class CreateUsers implements Seeder {
public async run(factory: Factory, connection: Connection): Promise<any> {
await factory(User)().createMany(10);
}
}

執行 Seeder

最後,我們可以使用 typeorm-seedingseed 命令來執行 seeder。

npx typeorm-seeding seed

這樣就完成了在 NestJS 中使用 Seeder 的設定。現在,我們可以方便地生成假數據來進行開發和測試了。

原生使用 Migration 實作 Seeder

export const RoleSeed = [
{
id: 1,
name: "admin",
},
{
id: 2,
name: "user",
},
];

由於 TypeORM 不像 Sequelize 有原生提供 seeding 的功能,這邊我們可以使用 Migration 來實作,非常簡單的,只要在 createTable 之後,透過 TypeORM Repository 來對 DB 進行操作就可以了 [^2]:

const roleRepository = getRepository("role");
await Promise.all(RoleSeed.map((role) => roleRepository.save(role)));

這邊由於開始使用 Repository,Typeorm 如果要關聯到對應的 Table 建立 Repository 時,會需要我們建立好的 Entity Class,所以這邊我們在 getRepositoty 中帶入前面 Entity name。

以上步驟都完成後,在一次 Build 執行 yarn typeorm migration:run 就可以了。

"script": {
...
"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js"
...
}