여러 레코드를 한번에 생성하는 bulkCreate 가 있다.
const captains = await Captain.bulkCreate([
{ name: 'Jack Sparrow' },
{ name: 'Davy Jones' }
]);
console.log(captains.length); // 2
console.log(captains[0] instanceof Captain); // true
console.log(captains[0].name); // 'Jack Sparrow'
console.log(captains[0].id); // 1 // (or another auto-generated value)
Captain 이라는 모델의 레코드를 2개 만드는 예시이다.
벌크생성을 할때 주의할점은 validations에 관한 부분이다.
const Foo = sequelize.define('foo', {
bar: {
type: DataTypes.TEXT,
validate: {
len: [4, 6]
}
}
});
// This will not throw an error, both instances will be created
await Foo.bulkCreate([
{ name: 'abc123' },
{ name: 'name too long' }
]);
// This will throw an error, nothing will be created
await Foo.bulkCreate([
{ name: 'abc123' },
{ name: 'name too long' }
], { validate: true });
예시에 나와있는 것처럼 모델을 만들 때 validate를 넣어놓고 bulkCreate를 하면 validate가 무시된다. 그러므로 bulkCreate를 할 때 validate가 있다면 예시에 나와있는것처럼 꼭 넣어야 작동한다.
사용자로부터 값을 직접 받을 때는 삽입하려는 열을 제한을 두는 것이 좋다고 한다. bulkCreate 에서도 field 는 먹힌다.
await User.bulkCreate([
{ username: 'foo' },
{ username: 'bar', admin: true }
], { fields: ['username'] });
// Neither foo nor bar are admins.
query문 ORDER BY 와 GROUP BY 를 하는 법에 대해서 공부하겠다.
Subtask.findAll({
order: [
// Will escape title and validate DESC against a list of valid direction parameters
['title', 'DESC'],
// Will order by max(age)
sequelize.fn('max', sequelize.col('age')),
// Will order by max(age) DESC
[sequelize.fn('max', sequelize.col('age')), 'DESC'],
// Will order by otherfunction(`col1`, 12, 'lalala') DESC
[sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],
// Will order an associated model's createdAt using the model name as the association's name.
[Task, 'createdAt', 'DESC'],
// Will order through an associated model's createdAt using the model names as the associations' names.
[Task, Project, 'createdAt', 'DESC'],
// Will order by an associated model's createdAt using the name of the association.
['Task', 'createdAt', 'DESC'],
// Will order by a nested associated model's createdAt using the names of the associations.
['Task', 'Project', 'createdAt', 'DESC'],
// Will order by an associated model's createdAt using an association object. (preferred method)
[Subtask.associations.Task, 'createdAt', 'DESC'],
// Will order by a nested associated model's createdAt using association objects. (preferred method)
[Subtask.associations.Task, Task.associations.Project, 'createdAt', 'DESC'],
// Will order by an associated model's createdAt using a simple association object.
[{model: Task, as: 'Task'}, 'createdAt', 'DESC'],
// Will order by a nested associated model's createdAt simple association objects.
[{model: Task, as: 'Task'}, {model: Project, as: 'Project'}, 'createdAt', 'DESC']
],
// Will order by max age descending
order: sequelize.literal('max(age) DESC'),
// Will order by max age ascending assuming ascending is the default order when direction is omitted
order: sequelize.fn('max', sequelize.col('age')),
// Will order by age ascending assuming ascending is the default order when direction is omitted
order: sequelize.col('age'),
// Will order randomly based on the dialect (instead of fn('RAND') or fn('RANDOM'))
order: sequelize.random()
});
Foo.findOne({
order: [
// will return `name`
['name'],
// will return `username` DESC
['username', 'DESC'],
// will return max(`age`)
sequelize.fn('max', sequelize.col('age')),
// will return max(`age`) DESC
[sequelize.fn('max', sequelize.col('age')), 'DESC'],
// will return otherfunction(`col1`, 12, 'lalala') DESC
[sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],
// will return otherfunction(awesomefunction(`col`)) DESC, This nesting is potentially infinite!
[sequelize.fn('otherfunction', sequelize.fn('awesomefunction', sequelize.col('col'))), 'DESC']
]
});
엄청난 양의 예시가 있는데 order: [[Model, column, option]]
으로 보인다. Model은 없어도 되고 2개가 있어도 되는것같다. 여기서 알아야할 문법은 sequelize.col() / sequelize.fn("QUERY", columns)
이 둘인데 .col은 해당 컬럼의 이름을 이용하는 것이고 .fn은 실제쿼리문을 이용할 수 있게 해주는 것이다.
Group은 Order 와 똑같은 문법을 사용한다고 한다.
The limit and offset options allow you to work with limiting / pagination:
// Fetch 10 instances/rows
Project.findAll({ limit: 10 });
// Skip 8 instances/rows
Project.findAll({ offset: 8 });
// Skip 5 instances and fetch the 5 after that
Project.findAll({ offset: 5, limit: 5 });
Usually these are used alongside the order option.
페이지에 일정양의 게시물을 보여줄때 사용하는 방법이다.
limit
은 레코드를 보내주는 양의 한계를 뜻하고 offset
은 offset 만큼을 제하고 다음부터 레코드를 건내주는 것이다.
테이블의 항목 갯수를 세는 용도이다.
const amount = await Project.count({
where: {
id: {
[Op.gt]: 25
}
}
});
console.log(`There are ${amount} projects with an id greater than 25`);
위의 예시는 25이상의 id 만 숫자를 세는 것이다.
마지막으로 max,min, sum 이다.
// 데이터 예시는 5, 10 40 이고 각각 최대값 최소값 합에 대해 말해주고 있다.
await User.max('age'); // 40
await User.max('age', { where: { age: { [Op.lt]: 20 } } }); // 10
await User.min('age'); // 5
await User.min('age', { where: { age: { [Op.gt]: 5 } } }); // 10
await User.sum('age'); // 55
await User.sum('age', { where: { age: { [Op.gt]: 5 } } }); // 50
Querying 부분은 기본적으로 많이 작성을 해보고 어떻게 데이터를 뽑아내야할지 고민해봐야겠다.