2.2.2 • Published 7 years ago

@mn-tech/egg-sequelize v2.2.2

Weekly downloads
1
License
MIT
Repository
github
Last release
7 years ago

egg-sequelize

Sequelize plugin in egg

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

Egg's sequelize plugin.

Install

$ 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

Usage & configuration

  • 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

Model files

Please put models under app/model dir.

Conventions

model fileclass name
user.jsapp.model.User
person.jsapp.model.Person
user_group.jsapp.model.UserGroup
  • Tables always has timestamp fields: created_at datetime, updated_at datetime.
  • Use underscore style column name, for example: user_id, comments_count.

Examples

Standard

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;
    }
  }
}

Full example

// 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 post.user = yield post.getUser();
      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

If you have added scripts of egg-sequelize into your package.json, now you can:

CommandDescription
npm run migrate:newGenerate a new Migration file to ./migrations/
npm run migrate:upRun Migration
npm run migrate:downRollback 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.

Questions & Suggestions

Please open an issue here.

License

MIT