docker pull mysql
docker images
//mysql-container 최초 실행
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest
docker ps-a
docker stop mysql-container
docker start mysql-container
docker restart mysql-container
//mysql-container shell 접속
docker exec -it mysql-container bash
생략
기본적인 내용이므로 생략
기본적인 내용이므로 생략
MySQL, MariaDB, PostgreSQL, SQLite에 사용가능한 js ORM
npm i sequelize sequelize-cli mysql2
npx sequelize init # initialization with boilerplates
config.json 설정 한 다음, 코드에서
const { sequelize } = require('./models');
sequelize.sync({ force: false })
.then( () => console.log("success"));
.catch( err => console.error(err));
모델은 DB의 테이블을 의미함
Sequelize는 자동으로 id컬럼을 생성해준다.
MySQL과 Sequelize의 자료형이 조금씩 다름을 기억해두자.
const Sequelize = require('sequelize');
module.exports = class User extends Sequelize.Model {
static init(sequelize) { // init gets two args
return super.init({ /* model defined obj */}, {/*table options */});
}
static associate(db) {}
};
모델 생성 후에는 ./models/index.js에서 모델을 연결하고 활성화한다.
const Sequelize = require('sequelize');
const User = require('./user');
const Comment = require('./comment');
db.sequelize = sequelize;
db.User = User;
db.Comment = Comment;
User.init(sequelize);
Comment.init(sequelize);
User.associate(db);
Comment.associate(db);
module.exports = db;
hasMany 메서드로 정의한다. 각각의 모델 클래스의 스태틱 메서드로 아래를 추가해준다.
// user.js
static associate(db) {
db.User.hasMany(db.Comment, {foreignKey : 'commenter', sourceKey: 'id'});
// comment.js
static associate(db) {
db.Comment.belongsTo(db.User, {foreignKey : 'commenter', sourceKey: 'id'});
hasOne과 belongsTo 메서드를 활용해서 정의한다.
두 메서드를 논리적으로 적합하게 사용해야 한다.
N:M 관계의 특성상 새로운 모델이 생성되고, 그 이름을 through 속성에 명시해준다.
db.Post.belongsToMany(db.Hashtag, {through: 'PostHashtag' });
db.Hashtag.belongToMany(db.Post, {through: 'PostHashtag' });
(당연하지만) 쿼리는 프로미즈를 반환한다.
.then과 async / await를 활용 가능하다.
Op.gt
Op.gte
Op.lt
Op.lte
Op.ne
Op.or
Op.in
Op.notIn
등의 연산자 활용가능하다.
User.create({});
User.findAll({
attributes: ['name', 'age'],
order: [['age','DESC'], ['name', 'ASC']],
where: { // 조건절 활용
married: true,
age: { [Op.gt]: 30}, // 연산자 활용 ES6 문법으로 동적 속성을 선언한 것
},
});
User.findOne({});
관계 쿼리
SQL의 조인기능을 간단하게 지원한다.
const user = await User.findOne({
include: [{
model: Comment,
}]
});
console.log(user.Comments);
// 나눠서 관계쿼리 수행도 가능하다.
// getComments() automatically created by Sequelize
const user = await User.findOne({});
const comments = await user.getComments();
console.log(comments);
// where clause available
const comment = user.getComments({
where: {
id: 1,
},
attributes: ['id'],
});
SQL 직접 쿼리도 당연히 가능하다.
const [result, metadata] = await sequelize.query('SELECT * from comments');
console.log(result);