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

mhr님의 프로필 이미지

작성한 질문수

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

typeorm seeding, migration

typeorm migration 실행이 안 됩니다.

작성

·

2K

0

제로초님 안녕하세요. 

강좌에 나온대로 app module에 TypeOrmModule 관련된 설정은 아래처럼 해둔 상태인데요.

npx typeorm migration:create -n categoryToType 명령어를 실행시키면 

...
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true, load: [getEnv] }),
TypeOrmModule.forRootAsync({
inject: [ConfigService],
useFactory: async (configService: ConfigService) => {
return {
type: 'mysql',
host: 'localhost',
port: 3306,
username: configService.get('DB_USERNAME'),
password: configService.get('DB_PASSWORD'),
database: configService.get('DB_DATABASE'),
entities: [
...
],
migrations: [__dirname + '/src/migrations/*.ts'],
cli: { migrationsDir: 'src/migrations' },
autoLoadEntities: true,
charset: 'utf8mb4',
synchronize: false,
logging: true,
keepConnectionAlive: true,
};
},
}),
UsersModule,
WorkspacesModule,
ChannelsModule,
DmsModule,
],
controllers: [AppController],
providers: [
AppService,
ConfigService,
{ provide: 'CUSTOM_KEY', useValue: 'CUSTOM_VALUE' },
UsersService,
],
exports: [],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer): any {
consumer.apply(LoggerMiddleware).forRoutes('*');
}
}

Not enough non-option arguments: got 0, need at least 1 이라는 에러메시지가 나오면서 마이그레이션이 안 됩니다. typeorm 공식문서(https://typeorm.io/using-cli#create-a-new-migration) 에서도 위처럼 TypeOrmModule 설정에 cli를 설정해두거나 아니면 npx typeorm migration:create -n UserMigration -d src/user/migration 이런 식으로 하게끔 되어 있는 것 같아서 path를 지정해서 해봤는데도 같은 에러가 나옵니다. 혹시 무엇이 문제인 걸까요?

답변 4

0

mhr님의 프로필 이미지
mhr
질문자

제로초님 안녕하세요. 알려주신 방식대로 실행해도 Missing required argument: dataSource 에러가 발생합니다. 직접 마이그레이션 파일을 작성한 뒤 npm run db:migrate를 실행시켜도 마찬가지이고요. datasource가 db connectio 관리하는 객체를 이야기하고, typeorm 문서에 나오는 DataSource 객체 생성 부분은 Nest에서 관리하는 것 같습니다. TypeOrmModule.footRootAsync 함수의 옵션 중에 dataSourceFactory라는 게 있어서 

dataSourceFactory: async () => {
return new DataSource({
type: 'mysql',
host: 'localhost',
port: 3306,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
entities: [
ChannelChats,
ChannelMembers,
Channels,
DMs,
Mentions,
Users,
WorkspaceMembers,
Workspaces,
],
migrations: [__dirname + '/src/migrations/*.ts'],
charset: 'utf8mb4',
synchronize: false,
logging: true,
});
},

위처럼 시도해봤는데 효과는 없네요. 

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

아예 data-source.ts를 따로 빼서 만들어야 하는 모양입니다.

https://github.com/typeorm/typeorm/issues/8810#issuecomment-1084255476

0

mhr님의 프로필 이미지
mhr
질문자

와 엄청 빠른 답변 감사합니다. 

저 그럼 혹시 package.json에는 변경사항을 어떤 식으로 반영해야할까요? 

{ ... "db:create-migration": "npm run typeorm migration:create -- -n", "db:generate-migration": "npm run typeorm migration:generate -- -n" }

강의에서는 위처럼 설정되어 있는데, -n이 없어졌다고 해서 없애고 돌려보니 dataSource가 필요하다고 해서 entities 폴더를 지정해서 npm run db:generate-migration src/migrations/categoryToType -d src/entities 이렇게 해봤는데 결과가 안 나오네요. 

검색해보니까 dataSource라는 게 https://typeorm.biunav.com/en/data-source.html#what-is-datasource 여기 나온 것처럼 DB connection을 담당하는 부분인 것 같은데, 여기서는 어떤 식으로 지정을 해줘야할까요. 

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

npm run db:generate-migration -- src/migrations/categoryToType -d src/entities

일것 같습니다. --가 원래 명령어에게 옵션 전달하는 명령어입니다.

0

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

npx typeorm migration:create src/user/migration

만 해보세요.

0

mhr님의 프로필 이미지
mhr
질문자

질문 올리고 구글링하다가 찾았습니다. 

https://stackoverflow.com/questions/72682474/typeorm-migrationgenerate-failure-not-enough-non-option-arguments-got-0-need

혹시 도움이 되시는 분들이 있을까 싶어서 질문글은 그냥 남겨두겠습니다. typeorm이 업데이트되면서 변화가 좀 있었네요. 

mhr님의 프로필 이미지

작성한 질문수

질문하기