npm install -g sequelize-cli
sequelize init
sequelize model:generate --name {모델명} --attributes {속성:타입},{속성:타입}
sequelize model:generate --name users --attributes email:string, age:number
이렇게 만들면 model폴더에 index.js와 users.js 파일이 생긴다.
동시에 migrations폴더에 {날짜}-create-users.js 파일도 동시에 생김.
'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
/**
* fs : 파일을 입출력해주는 라이브러리
* readdirSync('파일경로') : 디렉터리 기반 상대경로로 읽어냄.
*/
/**
* path : 파일과 디렉토리 경로를 정확히 맞춰줌
* path.basename() : 파일이름을 출력한다.
* path.join(): 플랫폼별(windows냐 mac이냐) 구분자를 사용해서 경로를 정규화해서 리턴
*
*/
fs
.readdirSync(__dirname)
.filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
// (file.indexOf('.') !== 0) '.'을 발견하는 인덱스가 0 이 아닐 경우
// (file !== basename) basename으로 파일 이름이 축출되고
// (file.slice(-3) === '.js') 확장명이 'js' 인 경우
//모두 만족하는 요소들만 필터링되도록
})
.forEach(file => {
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
// db가 빈 객체였는데, 여기에 요소를 채우기 시작.
}
});
// 모델들을 모두 db와 연결.
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
fs와 path는 파읽을 불러오고, 읽어낼때 사용하는 라이브러리이다. 파일 경로 설정을 정확하게 할 수 있는 장점이 있다.
index.js 파일에서는 모델들을 불러와서 db와 연결해 주는 역할을 한다. index.js 파일은 db요소를 배출해 낸다.
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class users extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
this.hasMany(models.reviews, {
foreignKey: 'users_id',
sourceKey: 'id',
onUpdate: 'cascade',
onDelete:'set null'
})
this.belongsToMany(models.bootcamp_lists, {
through: 'users_bootcamp',
targetKey: 'id',
foreignKey: 'users_id',
onUpdate: 'cascade',
onDelete: 'cascade'
})
}
};
users.init({
name: DataTypes.STRING,
active: DataTypes.BOOLEAN,
email: DataTypes.STRING,
role: {
type: DataTypes.ENUM,
values: ['manager', 'user', 'partner']
}
}, {
sequelize,
modelName: 'users',
timestamps: true,
charset: 'utf8'
});
return users;
};
class 버전말고 define 버전도 있는데 나는 그냥 처음 설정대로 사용함. associate부분은 다른 모델과 관계설정 해주는 부분이다. 이부분이 꽤나 복잡함.
users.init({params1},{params2})여기에서 params1은 데이터이름과 데이터 타입을 설정하는 구간이다. params2은 부수적인 설정을 해주는 위치이다. 모델이름, encoding방식, 그리고 timestamps을 사용할지 말건지 등을 결정해서 정한다.
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
name: {
type: Sequelize.STRING
},
active: {
type: Sequelize.BOOLEAN
},
email: {
type: Sequelize.STRING
},
role: {
type: Sequelize.ENUM,
values: ['manager', 'user', 'partner']
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
},
{ timestamp: true, underscored: false }
).then(function(){
queryInterface.createTable('users_bootcamp', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
},
users_id:{
type: Sequelize.INTEGER,
allowNull: true,
onDelete: 'cascade',
onUpdate: 'cascade',
references:{model: 'users',key: 'id'}
}
},{
timestamp: true, underscored: false
})}
)},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('users');
}
};
createTable() 단어가 핵심 단어이다. 데이터 타입 설정이 model폴더에 있는 파일들과 같은 타입으로 설정되어 있어야 한다.