migrate-seeder
Nest 是一個用於建立可擴展的 Node.js 應用程序的框架。在 Nest 中,遷移(migration)是一個用於管理數據庫結構變化的工具。下面是一個使用 Nest 遷移的詳細步驟:
首先,確保你已經安裝了 Nest CLI。如果還沒有安裝,可以使用以下命令進行安裝:
npm install -g @nestjs/cli
migrate
-
遷移文件將被創建在
src/migrations目錄下。打開創建的遷移文件,你將看到一個空的類,該類將繼承自MigrationInterface接口。在這個類中,你需要實現up和down方法。up方法用於定義你要在數據庫中進行的變化,而down方法則用於定義如何回滾這些變化。 -
在
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',
},
],
}));
}
- 在
down方法中,你需要定義如何回滾這些變化。以下是一個簡單的 例子:
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable('users');
}
- 當你完成了遷移文件的編寫,可以使用以下命令運行遷移:
npm run migration:run
這將自動應用你創建的遷移。
- 如果需要回滾遷移,可以使用以下命令:
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 是用來將假數據插入到資料庫的函式。我們可以使用 Factory 和 Connection 來建立一個 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-seeding 的 seed 命令來執行 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"
...
}