2023. 1. 13. 00:48ㆍNodeJs
| 목차 |
| 1. 타임스탬프(timestamps) |
| 2. 스키마 설계 2.1. 디폴트값 설정 2.2. 데이터 타입 |
| 3. 모델 인스턴스(Model Instance) : 메서드 3.1. 인스턴스 생성 3.2. 인스턴스 업데이트 3.3. 인스턴스 삭제 3.4. 인스턴스 값, 증가 / 감소 |
| 4. 모델 쿼리(Model Query) |
1. 타임스탬프(timestamps)
Sequelize는 데이터 유형을 사용하여 모든 모델(가상 테이블)에 필드 createdAt을 자동으로 추가해준다.

이렇게 자동으로 생성된 필드(createdAt, updatedAt)은 자동으로 관리된다.
Sequelize를 사용해서 만들거나 수정할 경우 자동으로 설정된다.
(단, 이는 Sequelize를 이용해야 업데이트되고, mysql등에 직접입력시 업데이트 되지않는다.)
createdAt과 updatedAt의 이름을 설정하거나, 기능을 끌 수 있다.
<필드에 추가 여부>
createdAt : true / false,
updatedAt : true / false,
<필드 이름 바꾸기>
createdAt : "field name",
updatedAt : "field name",
2. 스키마 설계
아래의 코드처럼 객체 안에 각 필드의 데이터 타입을 설정할 수 있다.
문법(Syntax)
sequelize.define( '모델명', { 필드명: { 데이터 정의 }, 필드명: { 데이터 정의 } }, { 옵션 정의 } )
예시(Sample)
sequelize.define('User', {
name: {
type: DataTypes.STRING,
}
age: {
type: DataTypes.INTEGER,
allowNull:false,
}
});
2.1 디폴트값 설정
defaultValue로 설정한다.
데이터 정의시 설정해주면 된다.
defaultValue: DataTypes.~,
defaultValue: "디폴트로 설정할 값"
2.2 데이터 타입
Sequelize에서 기본으로 제공하는 데이터 타입들이다.
내장된 데이터 유형에 접근하기 위해서는 DataTypes를 가져와야하나,
다음 코드와 같이 프로토타입을 이용해서 require("sequelize")를 변수에 담아 바로 접근해도 가능하다.
const Sequelize = require("sequelize")
Sequelize.STRING(1234)
// Sequelize.DataTypes.STRING(1234)
STRING 타입
| Sequelize | MySQL | 정의 |
| DataTypes.CHAR | CHAR | 고정 길이 데이터 |
| DataTypes.STRING | VARCHAR(255) | 가변 길이 데이터 |
| DataTypes.STRING(N) | VARCHAR(N) | 가변 길이 데이터 |
| DataTypes.STRING.BINARY | VARCHAR BINARY | ! |
| DataTypes.TEXT | TEXT | 문자열 데이터 타입(65535byte) |
| DataTypes.TEXT('tiny') | TINYTEXT | 문자열 데이터 타입(255byte) |
BOOLEAN 타입
| Sequelize | MySQL | 정의 |
| DataTypes.BOOLEAN | TINYINT(1) | True / False |
NUMBER 타입
| Sequelize | MySQL | 정의 |
| DataTypes.BIGINT | BIGINT | 정수형 데이터 타입(8byte) |
| DataTypes.INTEGER | INT | 정수형 데이터 타입(4byte) |
| DataTypes.MEDIUMINT | MEDIUMINT | 정수형 데이터 타입(3byte) |
| DataTypes.SMALLINT | SMALLINT | 정수형 데이터 타입(2byte) |
DATE 타입
| Sequelize | MySQL | 정의 |
| DataTypes.DATEONLY | DATE | 날짜(년, 월, 일) 형태의 기간 표현 데이터 타입(3byte) |
| DataTypes.TIME | TIME | 시간(시, 분, 초) 형태의 기간 표현 데이터 타입(3byte) |
| DataTypes.TIME(6) | TIME(6) | 시간(시, 분, 초) 형태의 기간 표현 데이터 타입 |
| DataTypes.DATE | DATETIME | 날짜와 시간 형태의 기간 표현 데이터 타입(8byte) |
| DataTypes.DATE(6) |
DATETIME(6) | 날짜와 시간 형태의 기간 표현 데이터 타입 |
3. 모델 인스턴스(Model Instance) : 메서드
생성된 인스턴스에 메서드를 사용해 데이터를 조작한다.
(모델아님)
3.1 인스턴스(데이터) 생성(입력)
build( ) & save( )
데이터베이스에 값을 넣기 위해서 사용하는 메서드이다.
(빌드되었다고하며, 빌드된 인스턴스는 디폴트값을 가져온다.)
const 변수 = 모델.build( { 키 : 값, } )
데이터 베이스에 들어가지는 않았지만, 가상의 DB에는 적용된 상태이다.
실제 데이터베이스에 넣기위해서는 save( )를 사용해야한다.
await 변수.save( )
위의 메서드는 복잡해서 잘 사용하지는 않고, 간단하게 create( )를 이용해서 데이터를 넣을 수 있다.
create( )
인스턴스.create( { 키 : 값 }, { 키 : 값 }, ... )
3.2 인스턴스(데이터) 업데이트
인스턴스의 필드값을 변경하는 경우 save( )를 통해 적용해야한다.
(인스턴스에는 점표기법으로 접근이 가능하다.)
const char1ey = await User.create({ name: "char1ey" }); // 데이터 생성(입력)
console.log(char1ey.name); // "char1ey"
char1ey.name = "char222ey"; // 값을 변경했으나, 데이터 베이스에 적용 X
await char1ey.save(); // 데이터 베이스에 적용
여러가지 정보를 변경하는 경우 set( )을 이용하면 된다.
const char1ey = await User.create( { name: "char1ey"} ); // 데이터 입력
char1ey.set({
name: "steve",
age: 29,
}); // 데이터 변경, 데이터베이스에 적용 X
await char1ey.save(); // 데이터 베이스에 적용
update( )
하지만 위와 같은 방법이 아니라, update( )로 값을 변경할 수도 있다.
인스턴스.update( { 키 : 값 } ) )
ex) 인스턴스.update( { key : value } ) )
const char1ey = await User.create({ name: "char1ey" });
await char1ey.update({ name: "steve" }) // 데이터 베이스에 적용
3.3 인스턴스(데이터) 삭제
다음은 인스턴스(데이터)의 삭제이다.
destroy( )
인스턴스.destroy( )
ex) 인스턴스.destroy( )
3.4 인스턴스값 증가 / 감소
increment / decrement 메서드를 이용해 숫자 값을 늘리거나 줄일 수 있다.
4. 모델 쿼리(Model Query)
입력(INSERT)
모델.create( { 키 : 값 } )
조회(SELECT)
모델.findAll( ) 모두 가져온다, 조건이 있을 시에는 조건에 맞는 모든것을 조회한다.
모델.findOne( ) 조건에 부합하는 것을 한 가지 조회해준다.
속성(Attribute)를 사용하여, 가져올 필드를 정할 수 있다.
Model.findAll({
attributes: ['userid', 'userpw']
});
// SELECT userid, userpw FROM Model
중첩 배열을 이용하면 이름도 변경할 수 있다.
Model.findAll({
attributes: ['userid', ['userpw', 'id'], 'password']
});
// SELECT userid, userpw AS id, password FROM Model
속성(필드)을 제외하고 조회할 수도 있다.(exclude)
Model.findAll({
attributes: { exclude: ['username'] }
});
// userid, userpw, username, birth, email 이 있다고 가정했을 때,
// SELECT userid, userpw, birth, email FROM Model
조건절(WHERE)
조건절에는 여러가지 연산자를 사용할 수 있다. 디폴트는 동등(equal, = )비교이다.
Model.findAll({
where: {
userid: "char1ey"
}
});
// SELECT * FROM Model WHERE userid="char1ey"
연산자(Op)를 사용해보자.
const { Op } = require("sequelize"); // sequelize.Op
Model.findAll({
where: {
userid: {
[Op.eq]: "char1ey"
}
}
});
// SELECT * FROM Model WHERE userid = "char1ey";
기본적으로 두가지 조건을 넣으면 AND로 비교해준다.
하지만, OR와 같은 연산을 위해서는 Op를 사용해 주어야한다.
const { Op } = require("sequelize");
Model.destroy({
where: {
userid: {
[Op.or]: ["char1ey", "steve"]
}
}
});
// DELETE FROM Model WHERE userid="char1ey" OR userid="steve"
연산자(Operator)의 종류
<출처 : sequelize 공식 홈페이지>
const { Op } = require("sequelize");
Post.findAll({
where: {
[Op.and]: [{ a: 5 }, { b: 6 }], // (a = 5) AND (b = 6)
[Op.or]: [{ a: 5 }, { b: 6 }], // (a = 5) OR (b = 6)
someAttribute: {
// Basics
[Op.eq]: 3, // = 3
[Op.ne]: 20, // != 20
[Op.is]: null, // IS NULL
[Op.not]: true, // IS NOT TRUE
[Op.or]: [5, 6], // (someAttribute = 5) OR (someAttribute = 6)
// Using dialect specific column identifiers (PG in the following example):
[Op.col]: 'user.organization_id', // = "user"."organization_id"
// Number comparisons
[Op.gt]: 6, // > 6
[Op.gte]: 6, // >= 6
[Op.lt]: 10, // < 10
[Op.lte]: 10, // <= 10
[Op.between]: [6, 10], // BETWEEN 6 AND 10
[Op.notBetween]: [11, 15], // NOT BETWEEN 11 AND 15
// Other operators
[Op.all]: sequelize.literal('SELECT 1'), // > ALL (SELECT 1)
[Op.in]: [1, 2], // IN [1, 2]
[Op.notIn]: [1, 2], // NOT IN [1, 2]
[Op.like]: '%hat', // LIKE '%hat'
[Op.notLike]: '%hat', // NOT LIKE '%hat'
[Op.startsWith]: 'hat', // LIKE 'hat%'
[Op.endsWith]: 'hat', // LIKE '%hat'
[Op.substring]: 'hat', // LIKE '%hat%'
[Op.iLike]: '%hat', // ILIKE '%hat' (case insensitive) (PG only)
[Op.notILike]: '%hat', // NOT ILIKE '%hat' (PG only)
[Op.regexp]: '^[h|a|t]', // REGEXP/~ '^[h|a|t]' (MySQL/PG only)
[Op.notRegexp]: '^[h|a|t]', // NOT REGEXP/!~ '^[h|a|t]' (MySQL/PG only)
[Op.iRegexp]: '^[h|a|t]', // ~* '^[h|a|t]' (PG only)
[Op.notIRegexp]: '^[h|a|t]', // !~* '^[h|a|t]' (PG only)
[Op.any]: [2, 3], // ANY (ARRAY[2, 3]::INTEGER[]) (PG only)
[Op.match]: Sequelize.fn('to_tsquery', 'fat & rat') // match text search for strings 'fat' and 'rat' (PG only)
// In Postgres, Op.like/Op.iLike/Op.notLike can be combined to Op.any:
[Op.like]: { [Op.any]: ['cat', 'hat'] } // LIKE ANY (ARRAY['cat', 'hat'])
// There are more postgres-only range operators, see below
}
}
});
수정(UPDATE)
모델.update( { 키 : 값 }, { 조건절 } )
삭제(DELETE)
모델.destroy( { 키 : 값 }, { 조건절 } )
기본적인것 이외에도 order, group, limit, offset 등도 있다.
https://sequelize.org/docs/v6/core-concepts/model-querying-basics/
Model Querying - Basics | Sequelize
Sequelize provides various methods to assist querying your database for data.
sequelize.org
'NodeJs' 카테고리의 다른 글
| NodeJs. JWT(JSON Web Token) 만들기 (0) | 2023.01.22 |
|---|---|
| NodeJs. JWT(JSON Web Token) (0) | 2023.01.20 |
| NodeJs.ORM - Sequelize(1) (1) | 2023.01.11 |
| NodeJs.ORM(Object Relational Mapping) (0) | 2023.01.11 |
| NodeJs.XMLHttpRequest의 이해(코드) (0) | 2023.01.04 |