egg-sequelize

Egg.js的Sequelize 插件。

注意: 这个插件仅仅是将Sequelize整合进Egg.js中,更多的文档请访问 http://sequelizejs.com查看。

NPM version
build status
Test coverage
David deps
Known Vulnerabilities
npm download

安装

  1. $ npm i --save egg-sequelize
  2. $ npm install --save mysql2 # 针对mysql和mariadb
  3. # 或使用其他数据库后端.
  4. $ npm install --save pg pg-hstore # PostgreSQL
  5. $ npm install --save tedious # MSSQL

用法 & 配置

  • config.default.js
  1. exports.sequelize = {
  2. dialect: 'mysql', // 支持: mysql, mariadb, postgres, mssql
  3. database: 'test',
  4. host: 'localhost',
  5. port: '3306',
  6. username: 'root',
  7. password: '',
  8. };
  • config/plugin.js
  1. exports.sequelize = {
  2. enable: true,
  3. package: 'egg-sequelize'
  4. }
  • package.json
    1. {
    2. "scripts": {
    3. "migrate:new": "egg-sequelize migration:create",
    4. "migrate:up": "egg-sequelize db:migrate",
    5. "migrate:down": "egg-sequelize db:migrate:undo"
    6. }
    7. }

更多文档请访问 Sequelize.js

模型文件

请将模型(model)文件放入 app/model 文件夹中

惯例

模型文件 类名
user.js app.model.User
person.js app.model.Person
user_group.js app.model.UserGroup
  • 表总是会有时间戳字段: created_at datetime, updated_at datetime
  • 使用下划线风格的列明, 例如: user_id, comments_count

示例

标准

首先定义一个模型。

注意: app.model 是一个 Sequelize的实例, 所以你可以像这样使用它上面的方法: app.model.sync, app.model.query ...

  1. // app/model/user.js
  2. module.exports = app => {
  3. const { STRING, INTEGER, DATE } = app.Sequelize;
  4. const User = app.model.define('user', {
  5. login: STRING,
  6. name: STRING(30),
  7. password: STRING(32),
  8. age: INTEGER,
  9. last_sign_in_at: DATE,
  10. created_at: DATE,
  11. updated_at: DATE,
  12. });
  13. User.findByLogin = function* (login) {
  14. return yield this.findOne({
  15. where: {
  16. login: login
  17. }
  18. });
  19. }
  20. User.prototype.logSignin = function* () {
  21. yield this.update({ last_sign_in_at: new Date() });
  22. }
  23. return User;
  24. };

现在你可以在你的控制器中使用它:

  1. // app/controller/user.js
  2. module.exports = app => {
  3. return class UserController extends app.Controller {
  4. * index() {
  5. const users = yield this.ctx.model.User.findAll();
  6. this.ctx.body = users;
  7. }
  8. * show() {
  9. const user = yield this.ctx.model.User.findByLogin(this.ctx.params.login);
  10. yield user.logSignin();
  11. this.ctx.body = user;
  12. }
  13. }
  14. }

完整的示例

  1. // app/model/post.js
  2. module.exports = app => {
  3. const { STRING, INTEGER, DATE } = app.Sequelize;
  4. const Post = app.model.define('Post', {
  5. name: STRING(30),
  6. user_id: INTEGER,
  7. created_at: DATE,
  8. updated_at: DATE,
  9. });
  10. Post.associate = function() {
  11. app.model.Post.belongsTo(app.model.User, { as: 'user' });
  12. }
  13. return Post;
  14. };
  1. // app/controller/post.js
  2. module.exports = app => {
  3. return class PostController extends app.Controller {
  4. * index() {
  5. const posts = yield this.ctx.model.Post.findAll({
  6. attributes: [ 'id', 'user_id' ],
  7. include: { model: this.ctx.model.User, as: 'user' },
  8. where: { status: 'publish' },
  9. order: 'id desc',
  10. });
  11. this.ctx.body = posts;
  12. }
  13. * show() {
  14. const post = yield this.ctx.model.Post.findById(this.params.id);
  15. const user = yield post.getUser();
  16. post.setDataValue('user', user);
  17. this.ctx.body = post;
  18. }
  19. * destroy() {
  20. const post = yield this.ctx.model.Post.findById(this.params.id);
  21. yield post.destroy();
  22. this.ctx.body = { success: true };
  23. }
  24. }
  25. }

将模型同步到数据库中

我们强烈建议您使用 migrations 来创建或迁移数据库。

下面的代码仅适合在开发环境中使用。

  1. // {app_root}/app.js
  2. module.exports = app => {
  3. if (app.config.env === 'local') {
  4. app.beforeStart(function* () {
  5. yield app.model.sync({force: true});
  6. });
  7. }
  8. };

迁移

如果你已经将egg-sequelize的NPM脚本添加进你的 package.json里,那么你就可以

命令 描述
npm run migrate:ne 在./migrations/里生成新的迁移文件
npm run migrate:up 运行迁移
npm run migrate:down 回滚一次迁移

例如:

  1. $ npm run migrate:up

unittest 环境下:

  1. $ EGG_SERVER_ENV=unittest npm run migrate:up

或者在 prod环境下:

  1. $ EGG_SERVER_ENV=prod npm run migrate:up

或是其他的环境:

  1. $ EGG_SERVER_ENV=pre npm run migrate:up

将会从 config/config.pre.js载入数据库配置。

想要用生成器写出友好的迁移你需要使用 co.wrap 方法:

  1. 'use strict';
  2. const co = require('co');
  3. module.exports = {
  4. up: co.wrap(function *(db, Sequelize) {
  5. const { STRING, INTEGER, DATE } = Sequelize;
  6. yield db.createTable('users', {
  7. id: { type: INTEGER, primaryKey: true, autoIncrement: true },
  8. name: { type: STRING, allowNull: false },
  9. email: { type: STRING, allowNull: false },
  10. created_at: DATE,
  11. updated_at: DATE,
  12. });
  13. yield db.addIndex('users', ['email'], { indicesType: 'UNIQUE' });
  14. }),
  15. down: co.wrap(function *(db, Sequelize) {
  16. yield db.dropTable('users');
  17. }),
  18. };

也许你需要阅读 Sequelize - Migrations 来学习如何写迁移。

推荐的示例

问题 & 建议

请在这里创建一个issue。

许可证

MIT