npm i sequelize mysql2 -S
npm i sequelize-cli -D
npx sequelize init
config/config.json 파일에 DB 정보 작성 후
npx sequelize db:create
를 치면 해당 저장소?에 데이터베이스 생긴다.
npx sequelize model:generate --name User --attributes email:string,nickname:string,password:string
이런 식으로 치면 테이블을 생성하는 migration파일과 테이블 관련 정보를 작성하는 model 파일이 생긴다.
이 때, 자동으로 되는 것들이 있는데 이걸 주의해야한다.
tableName : 'comment',
이걸 해당하는 model에 작성해주면 일단은 괜찮아지는데 무슨 다른 오류가 나올지 알 수 없다.
npx sequelize model:generate --name note --attributes noteid:integer,userid:integer,title:string,content:string,createdat:date,like:integer
npx sequelize model:generate --name comment --attributes commentid:integer,userid:integer,noteid:integer,content:string,createdat:date
npx sequelize model:generate --name user --attributes userid:integer,nickname:string,password:string
이건 초기에 썼던 것으로 여기서 각각의 primary key와 createdat은 빼도 된다. 자동으로 생겨서 중복만 된다.
필드의 제한사항을 추가로 작성하는 것 외에는 안건드는게 좋다.
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER,
type: Sequelize.STRING,
type: Sequelize.DATE,
unique: true,
이런 것들 중에 골라서 적으면 된다.
아무튼 migration은 테이블 생성하는 것들만 만들고 이 제한사항만 넣어주고 안건드는게 좋을 듯 하다.
autoIncrement는 migration에만 작성하면 적용이 안되는 걸 발견했다. models에도 써주니까 적용이 됐다.(models에만 적어도 되는지는 모르겠다.) 혹시 모르니 왠만하면 models에도 다 적는게 좋을 듯 하다.
여기서부터는 더 아래 글을 보면 된다. 이것까지 완료가 되면
npx sequelize db:migrate
이걸 치면 migration으로 생성하도록한 테이블정보에 model에 적은 것들이 추가로 덧붙여져서 테이블 쿼리가 만들어져서 테이블이 생성된다.
워크벤치로 외래키 확인해보면 외래키도 작성되어 있다.
npx sequelize migration:create --name 이름
npx sequelize db:migrate:undo
한번 칠때마다 마지막에 한것부터 하나씩 취소된다. table작성하는 migration만 작성해두고 원하는 대로 작성 안되면 이걸로 돌려서 수정한 후 다시 실행해야 한다. 왜냐하면 undo로 취소하지 않은 마이그래이션은 내용을 수정했다고 해도 다시 실행을 안한다.
models/index.js는 전혀 고칠 필요가 없다.
각 테이블들을 생성하는 migration을 작성한다. migration에는 foreign key 컬럼이 포함되어야 한다.
models 작성할 때는 foreign key에 해당하는 속성들은 빼고 작성한다.
models에 테이블 간의 1:N, N:1 관계 및 foreign key 작성.
.init은 원래 있는 거고 그 밑에 .associate부터 새로 작성하는 부분.
Post.init(
{
postId: {
primaryKey: true,
type: DataTypes.INTEGER,
},
imageUrl: DataTypes.STRING,
text: DataTypes.STRING,
},
{
sequelize,
modelName: "Post",
}
);
Post.associate = function (models) {
Post.belongsTo(models.User, {
foreignKey: "userId",
targetKey: "userId",
onUpdate: "cascade",
onDelete: "cascade",
});
Post.hasMany(models.Comment, {
foreignKey: "postId",
sourceKey: "postId",
onUpdate: "cascade",
onDelete: "cascade",
});
};
현재 모델이 N이면 belongsTo 호출한 후 targetKey를 쓰고 1인 모델의 primary key 대입.
현재 모델이 1이면 hasMany 호출한 후 sourceKey를 쓰고 자신의 primary key를 대입.