-
[Node.js] [Sequelize] Conversion failed when converting datetime from character string.이슈 해결 2019. 11. 6. 11:49
1. 문제
시퀄라이즈를 이용해서 Date 타입 필드를 where 조건에 걸어 조회하는 메소드를 사용했는데 다음과 같은 에러가 발생했다.
값에 역슬래시(이스케이프 처리) 때문에 문자열을 datetime으로 컨버팅에 실패한걸까?
문제는 해당 이스케이프 처리를 내가 한 게 아니라는거...
이스케이프 처리가 들어가야할 이유가 없는 것 같은데 왜 이스케이프 처리가 진행된 건지 모르겠다.모델은 다음과 같이 정의했다.
@Table({ freezeTableName: true, tableName: 'Some', timestamps: false, underscored: false }) export default class Some extends Model<Some> { @PrimaryKey @Colum(DataType.INTEGER) id!: number; ... @Column(DataType.DATE) dateTime!: Date; }
dateTime 필드의 타입을 DATE로 설정했다.
시퀄라이즈의 mssql data-types를 보면 DataType.DATE의 경우 DATETIMEOFFSET 타입으로 리턴하는 것을 알 수 있었다.
https://github.com/sequelize/sequelize/blob/master/lib/dialects/mssql/data-types.js
2. 해결
원인은 테이블의 dateTime 필드의 데이터 타입과 코드에서 던지는 값의 타입이 달라서 발생하는 문제였다.
테이블의 필드 타입은 DATETIME이었는데, 모델에선 DATE가 DATETIMEOFFSET 타입이니 값을 컨버팅하고 나서 대입하는데 에러가 발생한 것이다.
값을 확인해보면 DATE 뒤에 +09:00(UTC 한국시간) OFFSET 값이 추가되어 컨버팅 된 것을 알 수 있다.
이래서 값을 대입하는데 실패한 것이다.
이걸 어떻게 해결해야하나 고민했는데 DATEONLY 타입이 있더라.
이 타입은 간단하게 'YYYY-MM-DD'형식으로 포멧해서 값을 컨버팅 해준다.
그래서 모델에서 DATEONLY로 타입을 지정해서 사용해봤다.
@Table({ freezeTableName: true, tableName: 'Some', timestamps: false, underscored: false }) export default class Some extends Model<Some> { @PrimaryKey @Colum(DataType.INTEGER) id!: number; ... @Column(DataType.DATEONLY) dateTime!: Date; }
정상적으로 쿼리가 수행되더라.
'이슈 해결' 카테고리의 다른 글
[TS] 작업 "tsc: build - tsconfig.json"을 찾을 수 없습니다. (0) 2020.02.04 [JPA] @Scheduled 어노테이션과 트랜잭션 처리 (0) 2019.07.23 [AWS RDS] Unable to acquire JDBC Connection (0) 2019.05.27 [JPA] detached entity passed to persist. (0) 2019.04.17 [Spring Boot] Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException (0) 2019.03.17