Sequelize query

Vorhandenheit ·2022년 1월 6일
0

Database

목록 보기
10/28

Sequelize query

sequelize에서 CRUD 작업은 sql문을 자바스크립트를 통해 만듭니다. sql 쿼리는 프로미스를 반환하므로 then이나 asnyc/await문법으로 다룰 수 있습니다.

1. 기본사항

(1) 레코드(ROW) 생성

  • SQL
INSERT INTO users (name, age) VALUES('choongman', 30);
  • sequelize
Users.create({
	name: 'choongman',
  	age: 30
})

(2) 레코드(ROW) 조회

A. 모든 데이터

  • SQL
SELECT * FROM users;
  • sequelize
Users.findALL({});

B. 하나의 데이터

  • SQL
SELECT * FROM users LIMIT 1;
  • sequelize
Users.findOne({});

C. 특정 필드(Column)

  • SQL
SELECT name, married FROM users;
  • Sequelize
User.findAll({
	attributes: ['name', 'married']
})

D. 기본적 조건부 조회

  • SQL
SELECT name, age FROM users WHERE married = 1 AND age > 20;
  • Sequelize
Users.findALL({
	attiributes: ['name', 'age'],
    where: {
    	married: 1,
      	age: {[Op.gt]: 20}
    }
})
  • SQL
SELECT id, name FROM users WHERE married = 0 OR age < 20;
  • Sequelize
User.findALL({
	attributes: ['name', 'age'],
  where: {
  	[Op.or]: [{married: 0}, {age: {[Op.lt]}: 40}]
  }
})

E. 정렬하기(Order)

  • SQL
SELECT id, name FROM users ORDER BY age DESC;
  • Sequelize
User.findALL({
	attributes: ['name', 'age'],
  order: [['age', 'DESC']]
})

F. 조회할 레코드 개수 설정(limit, offset)

  • SQL
SELECT id, name FROM users ORDER BY age DESC LIMIT 1;
  • Sequelize
User.findALL({
	attributes: ['name', 'age'],
  	order: [['age', 'DESC']],
  	limit: 1
})

(3) 레코드(ROW) 수정 [Update]

  • SQL
SELECT users SET comment ='수정할 내용' WHERE id = 3;
  • Sequelize
User.update(
  {comment: '수정할 내용'},
  {where: { id: 3}}
})

(4) 레코드(ROW) 삭제 [delete]

  • SQL
DELETE FROM users WHERE id =4;
  • Sequelize
User.destroy({
	where: {id: 4}
}}

2. 관계 쿼리

먼저 연결관계를 정의하는 메서드 기준으로 , 함수를 호출하는 모델 객체가 source, 메서드 안에 인자로 전달되는 모델 객체가 target 입니다.

(1) 1: 1 관계

하나의 외래 키로 연결된 두 모델 간의 연결 관계

A. BelongsTo

외래키가 source 모델에 존재하는 연결관계 입니다.

const Player = this.sequelize.define('player', {});
const Team = this. sequelize.define('team', {});
Player.belongsTo(Team);                               

Player 모델에는 teamId 특성이 추가되며, 여기에 Team의 주요키가 들어있습니다.

Foreign Keys
belongsTo 관계에 외래키는 [target 모델의 이름 + target 모델 주요 키이름]으로 자동생성되는 것이 기본 값입니다.

  • as
    as를 사용하면 정의된 이름이 target 모델의 이름으로 사용됩니다.
const User = this.sequelize.define('user', {});
const UserRole = this.sequelize.define('userRole', {});
User.belongsTo(UserRole, {as : 'role'}) // roleId가 추가됩니다.
  • foreignKey
    foreignKey 옵션을 주면, as 옵션을 모두 무시하고 foreignKey 옵션의 값에 따라 왜리 키 컬럼을 짓습니다.
const User = this.sequelize.define('user', {})
const Company = this.sequelize.define('compnay', {});

User.belongsTo(Company, {foreignKey: 'fk_company'}) // User모델에 fk_company 특성을 추가됩니다.
  • Targetkey
    target 모델에 있는 칼럼으로, source 모델에 있는 외래 키 컬럼은 targetKey컬럼을 가리키게 됩니다. belongsTo 관계에서 targetKey는 기본값으로 target 모델의 주요 키를 가리킵니다.
const User = sequelize.define('user', {})
const Compnay = sequelize.define('company', { name: Sequelize.STRING });

User.belongsTo(Company, {foreignKey : 'fk_companyname', targetKey: 'name'})
// User 모델에 fk_companyname을 추가합니다.
//  fk_companyname이 가리키는 targeet 모델의 컬럼은 name컬럼

B. HasOne

일대일 관계를 위한 외래 키가 target 모델에 존재하는 관계

const User = sequelize.define('user', {})
const Profile = sequelize.define('profile', {})

User.hasOne(Profile)
Profile.belongsTo(User)

User 모델에 profileId를 자동으로 추가합니다.

(2) 1: N 관계

일대 다 관계는 단일 source를 복수의 target 모델에 연결합니다. 이때 target 모델은 반드시 단 하나의 source 모델에만 연결됩니다.

A. hasMany

const User = sequelize.define('user', {})
const Project = sequelize.define('project', {})

Project.hasMany(User, {as: 'Workers'})
const City = sequelize.define('city', {
	countryCode: Sequelize.STRING
})
const Country = sequelize.define('country', {isoCode: Sequelize.STRING });

Country.hasMany(City, {foreignKey: 'countryCode', sourceKey: 'isoCode'})
City.belonsTo(Country, {foreingKey: 'countryCode', targetKey: 'isoCode'})

(3) N: M 관계

다대다 관계는 다수의 source를 다수의 target과 연결할 때에 사용, 다수의 target은 다수의 source와 연결할 수 있습니다.

Project.belongsToMany(User, {through: 'UserProject'});
User.belongsToMany(Project, {through: 'UserProject'})

여기서 thrgouh는 필수 옵션입니다.
Project객체에는 getUsers, setUsers, addUser, addUser가 추가됩니다.
User객체에는 getProjects, setProjects, addProject, addProjects가 추가됩니다.

출처

<https://skyseven73.tistory.com/12
https://spicycookie.me/Nodejs/sequelizecrud/
https://velog.io/@cadenzah/sequelize-document-4
https://gngsn.tistory.com/71

profile
읽고 기록하고 고민하고 사용하고 개발하자!

0개의 댓글