egg-sequelize
用法 & 配置
exports.sequelize = {
dialect: 'mysql', // 支持: 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 dbundo"
}
}
更多文档请访问
模型文件
请将模型(model)文件放入 app/model
文件夹中
- 表总是会有时间戳字段:
created_at datetime
,updated_at datetime
。 - 使用下划线风格的列明, 例如:
user_id
,comments_count
。
示例
首先定义一个模型。
现在你可以在你的控制器中使用它:
// app/controller/user.js
module.exports = app => {
return class UserController extends app.Controller {
* index() {
this.ctx.body = users;
}
* show() {
const user = yield this.ctx.model.User.findByLogin(this.ctx.params.login);
yield user.logSignin();
this.ctx.body = user;
}
}
}
完整的示例
// app/model/post.js
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
const Post = app.model.define('Post', {
name: STRING(30),
user_id: INTEGER,
created_at: DATE,
updated_at: DATE,
});
Post.associate = function() {
app.model.Post.belongsTo(app.model.User, { as: 'user' });
}
return Post;
};
// 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);
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 };
}
}
}
将模型同步到数据库中
我们强烈建议您使用 migrations 来创建或迁移数据库。
下面的代码仅适合在开发环境中使用。
如果你已经将egg-sequelize的NPM脚本添加进你的 package.json
里,那么你就可以
命令 | 描述 |
---|---|
npm run migrate:ne | 在./migrations/里生成新的迁移文件 |
npm run migrate:up | 运行迁移 |
npm run migrate:down | 回滚一次迁移 |
例如:
$ npm run migrate:up
$ EGG_SERVER_ENV=unittest npm run migrate:up
或者在 prod
环境下:
$ EGG_SERVER_ENV=prod npm run migrate:up
或是其他的环境:
将会从 config/config.pre.js
载入数据库配置。
想要用生成器写出友好的迁移你需要使用 co.wrap
方法:
'use strict';
const co = require('co');
module.exports = {
up: co.wrap(function *(db, Sequelize) {
const { STRING, INTEGER, DATE } = Sequelize;
yield db.createTable('users', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
name: { type: STRING, allowNull: false },
email: { type: STRING, allowNull: false },
created_at: DATE,
updated_at: DATE,
});
yield db.addIndex('users', ['email'], { indicesType: 'UNIQUE' });
}),
down: co.wrap(function *(db, Sequelize) {
yield db.dropTable('users');
}),
};
也许你需要阅读 来学习如何写迁移。