기존에 mysql을 쓸때에는 createdAt, updatedAt은 따로 설정을 해주지 않아도 자동으로 생성되었다. 그런데, sequelize의 createdAt과 updatedAt의 allowNull을 false로 설정하고, Users 테이블에 데이터를 insert하려고 하니 위와 같은 에러가 발생했다. Default값을 설정하라는 에러이다.
공식문서
Note that if you are using Sequelize migrations you will need to add the createdAt and updatedAt fields to your migration definition:
module.exports = {
up(queryInterface, Sequelize) {
return queryInterface.createTable('my-table', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
// Timestamps
createdAt: Sequelize.DATE,
updatedAt: Sequelize.DATE,
})
},
down(queryInterface, Sequelize) {
return queryInterface.dropTable('my-table');
},
}
공식문서에 따르면, migration을 할 경우, createdAt과 updatedAt은 위와같이 정의해줘야한다고 쓰여있다.. 그래서 변경해주었지만 여전히 데이터베이스에 적용되지 않았다.
//변경 전
"use strict";
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable("Users", {
//생략...
createdAt: {
allowNull: false,
type: Sequelize.DATE,
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
},
});
},
//변경 후 (여전히 적용안됨..)
"use strict";
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable("Users", {
//생략...
createdAt: Sequelize.DATE,
updatedAt: Sequelize.DATE,
});
});
},
sequelize issue #645
위 링크를 참고하니 defaultValue를 설정해주더라도 defaultValue: sequelize.Now
로 해주면 안되고, defaultValue: sequelize.fn('NOW')
로 하라고 되어있다.
(방법1 변경 전의 형태로 복구시킨 후)defaultValue를 추가한 후 전부 다 migrate:undo를 한 후, 다시 migrate를 해주니 다음과 같이 잘 변경되었다.
createdAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.fn("NOW"), //이렇게 수정!
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.fn("NOW"),
},
다시 모델을 생성해서 해보았는데, 위와같은 에러가 발생하는 이유가 allowNull의 기본값이 true이고, Default값도 기본값이 Null이다. 따라서 아래와 같이 옵션에 {sequelize, timestamps: true}
를 지정해주니 데이터 삽입이 성공적으로 이루어졌다.
const User = sequelize.define(
//생략
createdAt: {
allowNull: false,
},
updatedAt: {
allowNull: false,
},
},
{ sequelize, timestamps: true }
);