ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js] sequelize 쿼리
    Node.js 2022. 4. 19. 10:10

    데이터 삽입 (INSERT 쿼리)

    create

    const jennie = await User.create({
        name : "JENNIE",
        age: 25,
        married : false,
        comment: "Jennie comment"
    });
    // INSERT INTO users(name, age, married, comment) VALUES("JENNIE", 25, false, "Jennie comment")

     

    결과 값

    console.log(jennie)
    User {
      dataValues: {
        created_at: 2022-04-06T06:25:49.678Z,
        id: 1,
        name: 'JENNIE',
        age: 25,
        married: false,
        comment: 'Jennie comment'
      },
      _previousDataValues: {
        name: 'JENNIE',
        age: 25,
        married: false,
        comment: 'Jennie comment',
        id: 1,
        created_at: 2022-04-06T06:25:49.678Z
      },
      uniqno: 1,
      _changed: Set(0) {},
      _options: {
        isNewRecord: true,
        _schema: null,
        _schemaDelimiter: '',
        attributes: undefined,
        include: undefined,
        raw: undefined,
        silent: undefined
      },
      isNewRecord: false
    }

     

    findOrCreate

    데이터 조회 후 테이블에 없는 값이면 생성하고 있으면 그 값을 가져오는 메소드

    const sandrara = await User.findOrCreate({
          where: { name: "sandara" }, // 1. 조건에 해당하는 데이터가 있는지 찾아줌
          defaults: { age: "23" },  // 2. 없다면 테이블에 없는 값이면 이 옵션에 넣어준 데이터도 함께 삽입 됨
        });

     

     

    데이터 조회 (SELECT 쿼리)

    findAll

    쿼리 결과를 배열 객체로 반환

    const users = await User.findAll({});
    // SELECT * FROM users

    결과 값

    [
      User {
        dataValues: {
          id: 1,
          name: 'JENNIE',
          age: 25,
          married: false,
          comment: 'Jennie comment',
          created_at: 2022-04-06T06:25:49.000Z
        },
    	...
      },
      User {
        dataValues: {
          id: 2,
          name: 'lisa',
          age: 20,
          married: true,
          comment: 'Lisa comment',
          created_at: 2022-04-08T00:53:24.000Z
        },
    	...
    ]

     

     

    findOne

    쿼리 결과를 객체로 반환

    해당되는 결과값이 여러개 있어도 1개만 반환 된다

    const users = await User.findOne({});
    // SELECT `id`, `name`, `age`, `married`, `comment`, `created_at` FROM `users` AS `User` LIMIT 1;

     

    결과 값

    User {
      dataValues: {
        id: 1,
        name: 'JENNIE',
        age: 25,
        married: false,
        comment: 'Jennie comment',
        created_at: 2022-04-06T06:25:49.000Z
      },
    	...
    }

     

    조건 조회 (attributes, where)

    attributes 옵션을 통해 원하는 컬럼만 가져 올 수 있다

    where 옵션을 통해 조건을 걸어줄 수 있다. 

     

      const users = await User.findAll({
          attributes: ["id", "name", "age", "comment"],
           where: {
            married: false,
          },
        });
       // SELECT id, name, age, comment FROM users WHERE married = 1

     

    where에서는 AND가 디폴트이기 떼문에 다른 연산을 적용하고 싶다면 sequelize의 Op객체를 사용해야 한다

     

    자주 쓰이는 Op 연산

    Op.gt 초과
    Op.gte 이상
    Op.lt 미만
    Op.lte 이하
    Op.ne 같지 않음
    Op.or 또는
    Op.and 그리고
    Op.in 배열 요소 중 하나
    Op.notIn 배열 요소와 모두 다름


    const { Op } = require("sequelize");
    
    const users = await User.findAll({
          where: {
            [Op.and]: [{ authorId: 12 }, { status: "active" }], // WHERE authorId=12 AND status='active'
            [Op.or]: [{ authorId: 12 }, { authorId: 13 }], // WHERE authorId=12 OR authorId=13
            authorId: { [Op.or]: [12, 13] }, // WHERE authorId=12 OR authorId=13
    
            [Op.eq]: 3, // =3
            [Op.ne]: 20, // != 20
            [Op.is]: null, // IS NULL
            [Op.not]: true, // IS NOT NULL
            [Op.or]: [5, 6], // =5 OR =6
    
            [Op.col]: "user.organization_id", //  = user.organization_id (user 테이블의 organization_id값과 같은지)
            [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
    
            [Op.in]: [1, 2], // [Op.in]:[1, 2] == [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%'
      	 
         },
    });

     

    정렬 (order)

    User.findAll({
      order: [ ['age', 'DESC'], ['name', 'ASC'] ]
    });
    // SELECT id, name FROM users ORDER BY age DESC name ASC;

     

    limit, offset

    User.findAll({
    	attributes: ['name', 'age'],
        order: [['age', 'DESC']],
        limit: 10,
        offset: 5,
    });
    
    // SELECT name, age FROM useres ORDER BY age DESC LIMIT 10 OFFSET 5

     

    데이터 수정 (UPDATE  쿼리)

    User.update({
      comment: 'NEW Comment',  // 수정할 내용
    }, {
      where: {id:2},  //  조건
    });
    
    // UPDATE users SET comment='NEW Comment' WHERE id=2

     

     

    데이터 삭제 (DELETE 쿼리)

    User.destroy({
      where: {id:2}
    });
    // DELETE FROM users WHERE id=2
    
    User.destroy({
      where: {id: {[Op.in]: [1,3,5]} }
    });
    // DELETE FROM users WHERE id in(1,3,5)

     

    JOIN

    await User.findOne({
      include: [
        {
          model: Comment,
        },
      ],
    });
    // SELECT * FROM users LEFT JOIN model ON users.id=comments.commenter

     

    raw query 사용하기

    const users = await sequelize.query("SELECT * FROM `users`", { type: QueryTypes.SELECT });

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    댓글

Designed by Tistory.