인프런 커뮤니티 질문&답변

서기문님의 프로필 이미지

작성한 질문수

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

typeorm seeding, migration

yarn seed 명령어 실행 시 데이터 삽입 안됨

해결된 질문

24.10.06 18:13 작성

·

62

0

image.png

이렇게 성공 메세지는 뜨는데 테이블 조회를 해보면 데이터 삽입이 안되어 있습니다.

어떤부분에서 오류를 해결해야 할까요?....

답변 4

1

서기문님의 프로필 이미지
서기문
질문자

2024. 10. 06. 20:53

해결하였습니다.

해결방법은 우선 아래 명령어를 통해 재설치를 하였습니다.

npm i -D ts-node

그리고 package.json 파일을 아래와 같이 수정하였습니다.

 "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js",
        "db:create": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js db:create -d ./dataSource.ts",
        "db:drop": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js db:drop -d ./dataSource.ts",
        "seed": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs seed:run -d ./dataSource.ts",
        "schema:drop": "ts-node ./node_modules/typeorm/cli.js schema:drop",
        "schema:sync": "ts-node ./node_modules/typeorm/cli.js schema:sync",
        "db:migrate": "npm run typeorm migration:run -- -d ./dataSource.ts",
        "db:migrate:revert": "npm run typeorm migration:revert -- -d ./dataSource.ts",
        "db:create-migration": "npm run typeorm migration:create -- ./src/migrations/",
        "db:generate-migration": "npm run typeorm migration:generate -- ./src/migrations -d ./dataSource.ts"

그 다음 스키마를 완전 삭제 후 스키마를 다시 생성 후
yarn run start:dev를 통해 테이블을 만들어주고

 

yarn seed 명령어를 입력하니 데이터가 생성되었습니다.


서기문님의 프로필 이미지
서기문
질문자

2024. 10. 06. 20:54

아마 스키마 생성도 오류없이 해결하실려면 seed처럼 수정해줘야 할것같습니다

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2024. 10. 07. 12:23

공유해주셔서 감사합니다!

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2024. 10. 06. 19:42

import { DataSource, DataSourceOptions } from 'typeorm';
import dotenv from 'dotenv';
import { SeederOptions } from 'typeorm-extension';
dotenv.config();

const dataSource = new DataSource({
  type: 'mysql',
  host: 'localhost',
  port: 3306,
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  entities: [__dirname + '/src/entities/**/*{.ts,.js}'],
  migrations: [__dirname + '/src/migrations/**/*{.ts,.js}'],
  seeders: [__dirname + '/src/database/seeds/**/*{.ts,.js}'],
  charset: 'utf8mb4_general_ci',
  synchronize: true,
  logging: true,
} as SeederOptions & DataSourceOptions);

export default dataSource;

여기처럼 seeders 옵션 넣어보셨나요?

서기문님의 프로필 이미지
서기문
질문자

2024. 10. 06. 20:00

//dataSource.ts파일
import { DataSource, DataSourceOptions } from 'typeorm';
import dotenv from 'dotenv';
import { SeederOptions } from 'typeorm-extension';

dotenv.config();

const dataSource = new DataSource({
    type: 'mysql',
    host: '127.0.0.1',
    port: 3306,
    username: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_DATABASE,
    entities: [__dirname + '/src/entities/**/*{.ts,.js}'],
    migrations: [__dirname + '/src/migrations/*.ts'],
    seeders: [__dirname + '/src/database/seeds/**/*{.ts,.js}'],
    charset: 'utf8mb4_general_ci',
    synchronize: true,
    logging: true,
} as SeederOptions & DataSourceOptions);

export default dataSource;
//app.module.ts파일

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { LoggerMiddleware } from './middlewares/logger.middleware';
import { UserModule } from './users/user.module';
import { WorkspacesModule } from './workspaces/workspaces.module';
import { ChannelsModule } from './channels/channels.module';
import { DmsModule } from './dms/dms.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { SeederOptions } from 'typeorm-extension';
import { DataSourceOptions } from 'typeorm';

@Module({
    imports: [
        ConfigModule.forRoot({ isGlobal: true }),
        UserModule,
        WorkspacesModule,
        ChannelsModule,
        DmsModule,
        TypeOrmModule.forRoot({
            type: 'mysql',
            host: '127.0.0.1',
            port: 3306,
            username: process.env.DB_USERNAME,
            password: process.env.DB_PASSWORD,
            database: process.env.DB_DATABASE,
            keepConnectionAlive: true,
            entities: [__dirname + '/src/entities/**/*{.ts,.js}'],
            migrations: [__dirname + '/src/migrations/*.ts'],
            seeders: [__dirname + '/src/database/seeds/**/*{.ts,.js}'],
            charset: 'utf8mb4_general_ci',
            synchronize: true,
            logging: true,
        } as SeederOptions & DataSourceOptions),
    ],
    controllers: [AppController],
    providers: [AppService, ConfigService],
})
export class AppModule implements NestModule {
    configure(consumer: MiddlewareConsumer): any {
        consumer.apply(LoggerMiddleware).forRoutes('*');
    }
}
// src/database/seeds/create-initial-data.ts 파일

import { Seeder, SeederFactoryManager } from 'typeorm-extension';
import { DataSource } from 'typeorm';
import { Workspaces } from '../../entities/Workspaces';
import { Channels } from '../../entities/Channels';

export default class UserSeeder implements Seeder {
    public async run(
        dataSource: DataSource,
        factoryManager: SeederFactoryManager,
    ): Promise<any> {
        const workspacesRepository = dataSource.getRepository(Workspaces);
        const channelsRepository = dataSource.getRepository(Channels);

        await workspacesRepository.insert([
            {
                id: 1,
                name: 'Slack',
                url: 'slack',
            },
        ]);

        console.log('Workspace inserted');

        await channelsRepository.insert([
            {
                id: 1,
                name: '일반',
                WorkspaceId: 1,
                private: false,
            },
        ]);

        console.log('Channel inserted');
    }
}

모두 위와같이 적용을 해봐도 명령어만 실행될 뿐 데이터가 추가되지는 않습니다...

0

서기문님의 프로필 이미지
서기문
질문자

2024. 10. 06. 18:32

{
    "name": "nest",
    "version": "0.0.1",
    "description": "",
    "author": "",
    "private": true,
    "license": "UNLICENSED",
    "scripts": {
        "build": "nest build",
        "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
        "start": "nest start",
        "start:dev-backup": "nest start --watch",
        "start:dev": "nest build --webpack --webpackPath webpack-hmr.config.js --watch",
        "start:debug": "nest start --debug --watch",
        "start:prod": "node dist/main",
        "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
        "test": "jest",
        "test:watch": "jest --watch",
        "test:cov": "jest --coverage",
        "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
        "test:e2e": "jest --config ./test/jest-e2e.json",
        "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js",
        "db:create": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:create -d ./dataSource.ts",
        "db:drop": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:drop -d ./dataSource.ts",
        "seed": "ts-node ./node_modules/typeorm-extension seed:run -d ./dist/dataSource.js",
        "schema:drop": "ts-node ./node_modules/typeorm/cli.js schema:drop",
        "schema:sync": "ts-node ./node_modules/typeorm/cli.js schema:sync",
        "db:migrate": "npm run typeorm migration:run -- -d ./dataSource.ts",
        "db:migrate:revert": "npm run typeorm migration:revert -- -d ./dataSource.ts",
        "db:create-migration": "npm run typeorm migration:create -- ./src/migrations/",
        "db:generate-migration": "npm run typeorm migration:generate -- ./src/migrations -d ./dataSource.ts"
    },
    "dependencies": {
        "@nestjs/common": "^9.0.1",
        "@nestjs/config": "^2.2.0",
        "@nestjs/core": "^9.0.1",
        "@nestjs/platform-express": "^9.0.1",
        "@nestjs/swagger": "^7.4.2",
        "@nestjs/typeorm": "^9.0.0",
        "class-transformer": "^0.5.1",
        "cliui": "7",
        "dotenv": "^16.4.5",
        "mysql2": "^3.11.3",
        "reflect-metadata": "^0.1.13",
        "rxjs": "^7.3.0",
        "typeorm": "^0.3.0",
        "typeorm-extension": "^3.6.1",
        "wrap-ansi": "6",
        "yargs": "16"
    },
    "devDependencies": {
        "@nestjs/cli": "^9.0.0",
        "@nestjs/schematics": "^9.0.1",
        "@nestjs/testing": "^9.0.1",
        "@types/express": "^4.17.8",
        "@types/jest": "^29.5.2",
        "@types/node": "^14.17.11",
        "@types/supertest": "^2.0.12",
        "@typescript-eslint/eslint-plugin": "^4.15.2",
        "@typescript-eslint/parser": "^4.15.2",
        "eslint": "^7.12.1",
        "eslint-config-prettier": "^8.3.0",
        "eslint-plugin-prettier": "^3.1.4",
        "jest": "^29.5.0",
        "prettier": "^3.0.0",
        "run-script-webpack-plugin": "^0.2.0",
        "source-map-support": "^0.5.21",
        "supertest": "^6.3.3",
        "ts-jest": "^29.1.0",
        "ts-loader": "^9.4.3",
        "ts-node": "^10.2.1",
        "tsconfig-paths": "^3.9.0",
        "typeorm-model-generator": "^0.4.6",
        "typescript": "^5.6.2",
        "webpack": "^5.95.0",
        "webpack-node-externals": "^3.0.0"
    },
    "jest": {
        "moduleFileExtensions": [
            "js",
            "json",
            "ts"
        ],
        "rootDir": "src",
        "testRegex": ".*\\.spec\\.ts$",
        "transform": {
            "^.+\\.(t|j)s$": "ts-jest"
        },
        "collectCoverageFrom": [
            "**/*.(t|j)s"
        ],
        "coverageDirectory": "../coverage",
        "testEnvironment": "node"
    }
}

참고로 package.json파일입니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 10. 06. 18:16

안녕하세요, 인프런 AI 인턴입니다. 서기문님.

yarn seed 명령어를 실행했을 때 성공 메시지가 나타나지만 실제로 데이터베이스에 삽입이 되지 않는 문제는 여러 가지 원인에 의해 발생할 수 있습니다. 다음은 문제를 해결하기 위한 몇 가지 점검 사항과 관련 링크를 안내드립니다.

  1. 데이터베이스 설정 확인: typeorm 설정 파일에서 synchronizelogging 옵션이 올바르게 설정되었는지 확인해 보세요. synchronize: true로 설정하면 typeorm이 엔티티 변경사항을 자동으로 반영하게 해줍니다.

  2. 경로 확인: Seed 파일의 경로와 데이터베이스 설정 파일에서 사용하는 경로가 일치하는지 확인하세요. 잘못된 경로 설정으로 인해 seed 파일이 제대로 인식되지 않을 수 있습니다.

  3. ORM Config 확인: ormconfig 파일에서 데이터베이스 연결 설정이 올바르게 되었는지 점검하세요. 연결이 되지 않는 경우 typeorm이 작동하지 않습니다.

  4. Seed 파일의 내용 검사: Seed 파일 내 삽입 데이터가 제대로 구성되어있는지 확인하세요. 데이터가 유효하지 않거나 제약조건에 맞지 않는 경우 삽입이 실패할 수 있습니다.

유사한 해결 방법을 소개하는 기존 게시물을 참고해 보세요:
- typeorm 0.3버전에 아직 seed기능 안나온걸까요?
- npm run seed 실행해도 테이블의 기본값이 생성되지 않는 이유가 뭔가요..??

위의 링크들은 지식공유자가 어떤 방법으로 문제를 해결했는지 보여주는 사례들입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.