Node.js Sequelize 사용해보기 - 2
Express에서 Sequelize ORM 사용하여 MySQL Join, Transaction 사용해보기
스키마 생성
관계를 맺기 위해 플레이어, 팀 테이블 스키마를 생성 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| module.exports = (sequelize, DataTypes) => { const players = sequelize.define('players', { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, name: { type: DataTypes.STRING, allowNull: false, validate: { notNull(val) { if (!val) { throw new Error('선수 이름이 입력되지 않았습니다.'); } }, }, }, position: DataTypes.STRING, }, { timestamps: false, }); players.associate = (models) => { players.belongsTo(models.teams); }; return players; };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| module.exports = (sequelize, DataTypes) => { const teams = sequelize.define('teams', { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, title: { type: DataTypes.STRING, allowNull: false, validate: { notNull(val) { if (!val) { throw new Error('팀 이름이 입력되지 않았습니다.'); } }, }, }, place: DataTypes.STRING, }, { timestamps: false, }); teams.associate = (models) => { teams.hasMany(models.players); }; return teams; };
|
조인
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| router.get('/join1', (req, res) => { db.players.findAll({ include: { model: db.teams }, }).then((result) => { if (!result.length) return res.json({ message: 'NOT FOUND' }); return res.json(result); }).catch((e) => res.json(e)); });
router.get('/join2', (req, res) => { db.teams.findAll({ include: { model: db.players }, }).then((result) => { if (!result.length) return res.json({ message: 'NOT FOUND' }); return res.json(result); }).catch((e) => res.json(e)); });
|
트랜잭션
선수를 등록을 하는데 해당 팀이 존재하면 커밋, 업으면 롤백 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| router.post('/transaction', (req, res) => { const { name, position, teamId } = req.body; db.sequelize.transaction().then(async (t) => { try { const player = await db.players.create({ name, position, teamId, }, { transaction: t }); await db.teams.findOne({ where: { id: player.teamId, }, }, { transaction: t }); t.commit(); return res.json({ message: 'create success' }); } catch (err) { t.rollback(); return res.json(err); } }).catch((e) => res.json(e)); });
|
sql
직접 쿼리 실행도 가능 하다.
1 2 3 4 5 6 7
| router.get('/query', (req, res) => { db.sequelize.query('select * from players').then((result) => { console.log(result); return res.json(result[0]); }).catch((e) => res.json(e)); });
|