Sequelize plugin in egg
Egg's sequelize plugin.
$ npm i --save egg-sequelize
# And one of the following:
$ npm install --save pg pg-hstore
$ npm install --save mysql # For both mysql and mariadb dialects
$ npm install --save tedious # MSSQL
config.default.js
exports.sequelize = {
dialect: 'mysql', // support: mysql, mariadb, postgres, mssql
database: 'test',
host: 'localhost',
port: '3306',
username: 'root',
password: '',
};
config/plugin.js
exports.sequelize = {
enable: true,
package: 'egg-sequelize'
}
package.json
{
"scripts": {
"migrate:new": "egg-sequelize migration:create",
"migrate:up": "egg-sequelize db:migrate",
"migrate:down": "egg-sequelize db:migrate:undo"
}
}
More documents please refer to Sequelize.js
Please put models under app/model
dir.
model file | class name |
---|---|
user.js |
app.model.User |
person.js |
app.model.Person |
user_group.js |
app.model.UserGroup |
- Tables always has timestamp fields:
created_at datetime
,updated_at datetime
. - Use underscore style column name, for example:
user_id
,comments_count
.
Define a model first.
// app/model/user.js
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
return app.model.define('user', {
login: STRING,
name: STRING(30),
password: STRING(32),
age: INTEGER,
created_at: DATE,
updated_at: DATE,
}, {
classMethods: {
* findByLogin(login) {
return yield this.findOne({ login: login });
},
},
});
};
Now you can use it in your controller:
// app/controller/user.js
module.exports = app => {
return class UserController extends app.Controller {
* index() {
const users = yield this.ctx.model.User.findAll();
this.ctx.body = users;
}
}
}
// app/model/post.js
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
return app.model.define('Post', {
name: STRING(30),
user_id: INTEGER,
created_at: DATE,
updated_at: DATE,
}, {
classMethods: {
associate() {
app.model.Post.belongsTo(app.model.User, { as: 'user' });
}
}
});
};
// app/controller/post.js
module.exports = app => {
return class PostController extends app.Controller {
* index() {
const posts = yield this.ctx.model.Post.findAll({
attributes: [ 'id', 'user_id' ],
include: { model: this.ctx.model.User, as: 'user' },
where: { status: 'publish' },
order: 'id desc',
});
this.ctx.body = posts;
}
* show() {
const post = yield this.ctx.model.Post.findById(this.params.id);
const user = yield post.getUser();
post.setDataValue('user', user);
this.ctx.body = post;
}
* destroy() {
const post = yield this.ctx.model.Post.findById(this.params.id);
yield post.destroy();
this.ctx.body = { success: true };
}
}
}
If you have added scripts of egg-sequelize into your package.json
, now you can:
Command | Description |
---|---|
npm run migrate:new | Generate a new Migration file to ./migrations/ |
npm run migrate:up | Run Migration |
npm run migrate:down | Rollback once Migration |
For example:
$ npm run migrate:up
For test
environment:
$ NODE_ENV=test npm run migrate:up
or for production
environment:
$ NODE_ENV=production npm run migrate:up
And you may need to read Sequelize - Migrations to learn about how to write Migrations.
Please open an issue here.