result : [
  Campain {
    dataValues: { .... },

_previousDataValues: { ... } ,

    _changed: Set(0) {},
    _options: {
      isNewRecord: false,
      _schema: null,
      _schemaDelimiter: '',
      raw: true,
      attributes: [Array]
    },
    isNewRecord: false
  }
]

 

이렇게 나온다...

 

나는 dataValues에 든 값만 원하는데... 

 

접근하기도 어렵고 왜 이런 쓸데없는 것까지 나오는 것일까?

 

https://stackoverflow.com/questions/46380563/get-only-datavalues-from-sequelize-orm

 

Get only dataValues from Sequelize ORM

I'm using the sequelize ORM to fetch data from a PSQL DB. However, when I retrieve something, a whole bunch of data is given. The only data I want is inside 'dataValues'. Of course, I can use object.

stackoverflow.com

 

해결책은 여기.

 

모델 인스턴스가 아닌,  데이터만 반환하기 위해서는 

 

raw: true를 

 

findAll({

 

시작하자마자 작성해주자. 그러면, 된다. 

 

dataValues만 나오는 것을 확인하자. 이것이 내가 원하는 데이터이다. 오호~

Posted by sungho88
,

 

시퀄라이즈를 사용하다보니 모델에서 수정을 해도 변경이 되지 않는 것을 확인할 수 있었다.

서버를 껐다가 켜봐도 ...

 

난 분명히 allowNull을 false에서 true로 변경했는데, 위와 같이 null이 불가능하다는 에러를 계속 내보내고 있었다.

당황스럽다. 아무리 고치고 껐다가 켜봐도 안되서...

 

SQL문을 사용해보기로 했다.

 

alter table users modify column confirm_password varchar(255);  // null 허용

alter table users modify column confirm_password varchar(255) not null;  // null 비허용

이렇게 하면, users 테이블에서 confirm_password 컬럼을 수정하겠다는 의미이다.

not null을 명시해서 쓰면 null을 허용하지 않겠다는 의미이며, 생략하게 되면 기본적으로 null을 허용한다는 의미가 된다.

 

이렇게 입력한 뒤, 다시해보니까 해결되었다. 이런 에러가 가장 싫다. 

 

에러가 아니라 버그?

 

버그 하나 발견한 하루였다.

 

 

Posted by sungho88
,

시퀄라이즈는 SQL문을 자바스크립트 프로젝트 내에서 자바스크립트 객체로 작성할 수 있습니다. 

그렇지만, 시퀄라이즈 자체의 SQL과 다른 문법이 존재하기 때문에 이것도 익히는데 시간이 걸릴 것 같습니다.

또한, SQL문 데이터베이스를 다룰 백엔드 개발자라면 필수로 배우고 알아둬야하기 때문에 어떤 것을 쓰는게 맞을지 모르겠습니다.

하여튼 Sequelize 문법을 알아보겠습니다. 위에 SQL을 적어 해당 SQL문이 시퀄라이즈로 작성할때 어떻게 바뀌는지 보겠습니다.

 

먼저, 가장 간단한 CRUD부터 익혀보겠습니다. 

 

1) 생성하기(INSERT) 

INSERT INTO users (name,age,married,comment) VALUES ('JANG', 24, 0, '코멘트~');

 

User.create({ // Promise 방식 

name: 'JANG',

age:24,

married: false,

comment: '코멘트~'

});

 

2) 조회하기(SELECT)

// 모든 컬럼을 전부 가지고 오기.

SELECT * FROM users;

 

User.findAll():

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

// 일부 컬럼만 전부 가지고 오기.

SELECT name, married FROM users;

 

User.findAll({

attributes: ['name','married'],

});

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

[WHERE절 추가]

 

SELECT * FROM users WHERE authorId = 2

 

User.findAll({

 where: { authorId: 2 }

});  

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

SELECT * FROM users WHERE authorId = 12 AND status = 'active';

 

User.findAll({

 where: {

  authorId: 12,

  status: 'active'

   }

});

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

Op라는 연산자가 존재한다. 이것으로 조건문등의 조건을 정할 수 있다.

 

Op.eq --> SELECT * FROM users WHERE authorId = 2와 동일하다.

const { Op } = require("sequelize");
User.findAll({
  where: {
    authorId: {
      [Op.eq]: 2
    }
  }
});

Op.and --> 위 SELECT * FROM users WHERE authorId = 12 AND status = 'active'; 와 동일해짐.

const { Op } = require("sequelize");
User.findAll({
  where: {
    [Op.and]: [
      { authorId: 12 },
      { status: 'active' }
    ]
  }
});

Op.or --> SELECT * FROM users WHERE authorId = 12 OR authorId = 13; 을 표현할 수 있다.

const { Op } = require("sequelize");
User.findAll({
  where: {
    [Op.or]: [
      { authorId: 12 },
      { authorId: 13 }
    ]
  }
});

위와 같이 동일한 필드를 조건문으로 찾을 경우, 구조를 바꿔서 좀 더 읽기 쉽게 바꿀 수 있다.

 

DELETE FROM post WHERE authorId = 12 OR authorId = 13;

const { Op } = require("sequelize");
Post.destroy({
  where: {
    authorId: {
      [Op.or]: [12, 13]
    }
  }
});

그 외 엄청나게 많은 종류의 연산자를 제공한다.

너무 많고해서 복붙해 넣었다. 이런게 있구나만 보고 넘어가자.

const { Op } = require("sequelize");
User.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)

      // 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
    }
  }
});

 

Posted by sungho88
,