[DB] Sequelize CRUD와 관계 설정
CRUD
1. CREATE
User.create({
name: '까까',
age: 7,
gender: 'male'
});
- models에서 불러온 모델을 바탕으로
create
메소드 사용
- Sequelize : id, createdAt, updatedAt 필드는 자동으로 생성
2. READ
1) findAll
User.findAll({
attributes: ['name', 'age']
})
User.findAll({
attributes: ['name', 'age'],
where: {
gender: 'male'
}
})
User.findAll()
// SELECT * FROM Users
- 모델은 단수형으로 생성
*테이블은 복수형으로 자동 생성
2) findOne
User.findOne({ where: { name: '까까' } })
3) findByPk
User.findByPk(1)
- Pk를 이용하여 조회
4) findOrCreate
const [user, created] = User.findOrCreate({
where: { name: '까까' },
defaults: {
gender: 'male'
}
})
- 만약 존재한다면 해당하는 인스턴스를 반환하고, 그렇지 않으면 새로 생성
- created : 새 객체가 생성되었을 경우 true, 그렇지 않을 경우 false
- where에 함께 전달되는 defaults 옵션은 검색 결과가 존재하지 않을 경우 새로 생성되는 요소가 갖는 기본값
3. UPDATE
User.UPDATE({age: 8}, {
where: {
name: '까까'
}
})
const result = User.findByPk(1)
result.UPDATE({
age: result.age + 1
})
const result = User.findByPk(1)
result.age++
result.save()
UPDATE
메소드를 사용하지 않고 변경한 경우 save()
메소드로 저장해 주어야 함
4. DELETE
User.destroy({
where: {
name: '까까'
}
})
관계 정의
1. 관계 설정 방법
1) 1:1
User.hasOne(Profile)
Profile.belongsTo(User)
2) 1:N
Team.hasMany(Player)
Player.belongsTo(Team)
3) N:M
Project.belongsToMany(User, {through: 'UserProject'});
User.belongsToMany(Project, {through: 'UserProject'});
- through를 사용해서 중간 테이블을 명시
2. 관계 설정 예시 (1:N)
예시 : users 테이블과 urls 테이블을 1:N 관계로 설정하기
- urls 테이블에 userId 필드 생성
- userId는 users 테이블의 id를 Fk로 가져옴
1) column을 추가하는 migration 생성
// add-userId-column-to-url migration 생성
module.exports = {
up: async (queryInterface, Sequelize) => {
// 1. Column 생성 : addColumn 메소드 사용
await queryInterface.addColumn("urls", "userId", Sequelize.INTEGER);
// 2. Fk 제약 조건 설정
await queryInterface.addConstraint("urls", {
fields: ["userId"],
type: "foreign key",
name: "USERID_IS_FOREIGN_KEY",
references: {
table: "users",
field: "id",
},
onDelete: "cascade",
onUpdate: "cascade",
// cascade : 부모테이블 primary 값이 수정 또는 삭제될 경우 해당 값도 수정 또는 삭제
});
},
down: async (queryInterface, Sequelize) => {
// 1. Fk 제약 조건 삭제
await queryInterface.removeConstraint("urls", "USERID_IS_FOREIGN_KEY");
// 2. Column 삭제
await queryInterface.removeColumn("urls", "userId");
},
};
2) 1:N의 관계 지정
(1) 각각의 model에 지정
// url.js
class url extends Model {
static associate(models) {
models.url.belongsTo(models.user);
}
}
// user.js
class user extends Model {
static associate(models) {
models.user.hasMany(models.url);
}
}
(2) index.js에서 한번에 지정
// index.js
url.belongsTo(user);
user.hasMany(url);
References
User.create({
name: '까까',
age: 7,
gender: 'male'
});
create
메소드 사용User.findAll({
attributes: ['name', 'age']
})
User.findAll({
attributes: ['name', 'age'],
where: {
gender: 'male'
}
})
User.findAll()
// SELECT * FROM Users
*테이블은 복수형으로 자동 생성
User.findOne({ where: { name: '까까' } })
User.findByPk(1)
const [user, created] = User.findOrCreate({
where: { name: '까까' },
defaults: {
gender: 'male'
}
})
User.UPDATE({age: 8}, {
where: {
name: '까까'
}
})
const result = User.findByPk(1)
result.UPDATE({
age: result.age + 1
})
const result = User.findByPk(1)
result.age++
result.save()
UPDATE
메소드를 사용하지 않고 변경한 경우 save()
메소드로 저장해 주어야 함User.destroy({
where: {
name: '까까'
}
})
1. 관계 설정 방법
1) 1:1
User.hasOne(Profile)
Profile.belongsTo(User)
2) 1:N
Team.hasMany(Player)
Player.belongsTo(Team)
3) N:M
Project.belongsToMany(User, {through: 'UserProject'});
User.belongsToMany(Project, {through: 'UserProject'});
- through를 사용해서 중간 테이블을 명시
2. 관계 설정 예시 (1:N)
예시 : users 테이블과 urls 테이블을 1:N 관계로 설정하기
- urls 테이블에 userId 필드 생성
- userId는 users 테이블의 id를 Fk로 가져옴
1) column을 추가하는 migration 생성
// add-userId-column-to-url migration 생성
module.exports = {
up: async (queryInterface, Sequelize) => {
// 1. Column 생성 : addColumn 메소드 사용
await queryInterface.addColumn("urls", "userId", Sequelize.INTEGER);
// 2. Fk 제약 조건 설정
await queryInterface.addConstraint("urls", {
fields: ["userId"],
type: "foreign key",
name: "USERID_IS_FOREIGN_KEY",
references: {
table: "users",
field: "id",
},
onDelete: "cascade",
onUpdate: "cascade",
// cascade : 부모테이블 primary 값이 수정 또는 삭제될 경우 해당 값도 수정 또는 삭제
});
},
down: async (queryInterface, Sequelize) => {
// 1. Fk 제약 조건 삭제
await queryInterface.removeConstraint("urls", "USERID_IS_FOREIGN_KEY");
// 2. Column 삭제
await queryInterface.removeColumn("urls", "userId");
},
};
2) 1:N의 관계 지정
(1) 각각의 model에 지정
// url.js
class url extends Model {
static associate(models) {
models.url.belongsTo(models.user);
}
}
// user.js
class user extends Model {
static associate(models) {
models.user.hasMany(models.url);
}
}
(2) index.js에서 한번에 지정
// index.js
url.belongsTo(user);
user.hasMany(url);
References
Author And Source
이 문제에 관하여([DB] Sequelize CRUD와 관계 설정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sominpark/DB-NoSQL-도큐먼트-데이터베이스-MongoDB저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)