반응형
TIL 230425_sequelize 기반으로 게시판 api만들기1
✅오늘 학습 Keyword
MySQL, Sequelize, migration, model
✅개념정리
Sequelize-ORM(Object Relational Mapping)으로써 자바스크립트 객채(Object)와 데이터베이스의 releationship을 Mapping해주는 도구,Sequelize와 같은 ORM들은 관계형 데이터 베이스(RDB)를 사용할 수 있다.
Sequelize의 마이그레이션, 모델
migration
-MySQL에 테이블을 정의하고 생성하기 위해 사용
//로그인에 필요한 기능, 이메일, 패스워드 두가지의 컬럼을 가진다.
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.createTable('Users', {
userId: {
allowNull: false, // NOT NULL
autoIncrement: true, // AUTO_INCREMENT
primaryKey: true, // Primary Key (기본키)
type: Sequelize.INTEGER,
},
email: {
allowNull: false, // NOT NULL
type: Sequelize.STRING,
unique: true,
},
password: {
allowNull: false, // NOT NULL
type: Sequelize.STRING,
},
createdAt: {
allowNull: false, // NOT NULL
type: Sequelize.DATE,
defaultValue: Sequelize.fn('now'),
},
updatedAt: {
allowNull: false, // NOT NULL
type: Sequelize.DATE,
defaultValue: Sequelize.fn('now'),
},
});
},
async down(queryInterface, Sequelize) {
await queryInterface.dropTable('Users');
},
};
model
-특정 table과 column의 속성값을 입력하여 MySQL과 Express를 mapping 시켜줌.
-즉 실제로 생성된 테이블을 연결한다.
'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class Users extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
// 1. Users 모델에서
this.hasOne(models.UserInfos, {
// 2. UserInfos 모델에게 1:1 관계 설정을 합니다. //this 는 현제 테이블, 즉 User 모델
sourceKey: 'userId', // 3. Users 테이블의 userId 컬럼을
foreignKey: 'UserId', // 4. UserInfos 모델의 UserId 컬럼과 연결합니다.
});
// 1. Users 모델에서
this.hasMany(models.Posts, {
// 2. Posts 모델에게 1:N 관계 설정을 합니다.
sourceKey: 'userId', // 3. Users 모델의 userId 컬럼을
foreignKey: 'UserId', // 4. Posts 모델의 UserId 컬럼과 연결합니다.
});
}
}
Users.init(
{
userId: {
allowNull: false, // NOT NULL
autoIncrement: true, // AUTO_INCREMENT
primaryKey: true, // Primary Key (기본키)
type: DataTypes.INTEGER,
},
nickname: {
allowNull: false, // NOT NULL
type: DataTypes.STRING,
unique: true,
},
password: {
allowNull: false, // NOT NULL
type: DataTypes.STRING,
},
createdAt: {
allowNull: false, // NOT NULL
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
},
updatedAt: {
allowNull: false, // NOT NULL
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
},
},
{
sequelize,
modelName: 'Users',
}
);
return Users;
};
✅오늘 겪은 문제
-게시판API 구현을 위한 DB를 SEQUELIZE로 생성하였으나 필요없는 컬럼 'email'이 들어가있어서 변경하고싶었다.
-/api/users/:userid를 통해 특정 사용자 조회를 하려했으나 특정사용자가 출력되지 않음.
✅해결방법
-userId를 끌어올 경로가 지정되어있지 않아서 발생하는 문제였고, where항목을 추가해주었다.
-아래와 같이 Users 테이블의 email 컬럼을 nickname으로 변경하고싶었다.
-우선 변경을 위한 마이그레이션을 생성해준다!
sequelize migration:create --name 생성하는 migration 이름
-그 후renameColumn() 함수를 사용하여 컬럼명을 바꿔준다.
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
//await queryInterface.renameColumn(테이블명, 컬럼 이름 변경 전 , 컬럼 이름 변경 후 )
await queryInterface.renameColumn('Users', 'email', 'nickname');
/**
* Add altering commands here.
*
* Example:
* await queryInterface.createTable('users', { id: Sequelize.INTEGER });
*/
},
async down(queryInterface, Sequelize) {
/**
* Add reverting commands here.
*
* Example:
* await queryInterface.dropTable('users');
*/
},
};
반응형
'개발 > 차근차근 개발일지 TIL' 카테고리의 다른 글
TIL 230429_sequelize 기반으로 게시판 api만들기2 (0) | 2023.04.29 |
---|---|
TIL 230426_Shop Project : Middleware, Swagger (0) | 2023.04.26 |
TIL, WIL 230423_RESTful API, Package.json, cookies, session, 주특기 2주차 과제 관련 오류&해결 (1) | 2023.04.24 |
TIL 230421 (0) | 2023.04.21 |
쇼핑몰//회원가입-로그인 api 구현 참고용 총정리 (0) | 2023.04.21 |