Nighttime Possum Meandering

    egg-isequelize

    2.0.0-beta.3 • Public • Published

    egg-isequelize

    Sequelize plugin for Egg.js.

    NOTE: This plugin just for integrate Sequelize into Egg.js, more documentation please visit http://sequelizejs.com.

    Install

    $ npm i --save egg-sequelize
    $ npm install --save mysql2 # For both mysql and mariadb dialects 
     
    # Or use other database backend. 
    $ npm install --save pg pg-hstore # PostgreSQL 
    $ npm install --save tedious # MSSQL 

    Usage & configuration

    • config.default.js
    exports.sequelize = {
      client: {
        dialect: 'mysql', // support: mysql, mariadb, postgres, mssql
          database: 'test',
          host: 'localhost',
          port: '3306',
          username: 'root',
          password: '',
      },
      // or multiple source
      clients: {
        mysql: {
          dialect: 'mysql', // support: mysql, mariadb, postgres, mssql
          database: 'test',
          host: 'localhost',
          port: '3306',
          username: 'root',
          password: '',
        },
        pg: {
          ...
        }
      },
    };
    • config/plugin.js
    exports.sequelize = {
      enable: true,
      package: 'egg-isequelize'
    }
    • 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 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.

    Examples

    Standard

    Define a model first.

    NOTE: app.model is an Instance of Sequelize, so you can use methods like: app.model.sync, app.model.query ...

    // multiple source
    const mysql = app.model.get('mysql');
    const pg = app.model.get('pg');
    ...
    // app/model/user.js
     
    module.exports = app => {
      const { STRING, INTEGER, DATE } = app.Sequelize;
     
      const User = app.model.define('user', {
        login: STRING,
        name: STRING(30),
        password: STRING(32),
        age: INTEGER,
        last_sign_in_at: DATE,
        created_at: DATE,
        updated_at: DATE,
      });
     
      User.findByLogin = function* (login) {
        return yield this.findOne({
          where: {
            login: login
          }
        });
      }
     
      User.prototype.logSignin = function* () {
        yield this.update({ last_sign_in_at: new Date() });
      }
     
      return User;
    };
     

    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;
        }
     
        * show() {
          const user = yield this.ctx.model.User.findByLogin(this.ctx.params.login);
          yield user.logSignin();
          this.ctx.body = user;
        }
      }
    }

    Full example

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

    Sync model to db

    We strongly recommend you to use migrations to create or migrate database.

    This code should only be used in development.

    // {app_root}/app.js
      module.exports = app => {
        if (app.config.env === 'local') {
          app.beforeStart(function* () {
            yield app.model.sync({force: true});
          });
        }
      };

    Migrations

    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 unittest environment:

    $ EGG_SERVER_ENV=unittest npm run migrate:up

    or for prod environment:

    $ EGG_SERVER_ENV=prod npm run migrate:up

    or for others environment:

    $ EGG_SERVER_ENV=pre npm run migrate:up

    This will load database config from config/config.pre.js.

    Write migrations with Generator friendly, you should use co.wrap method:

    '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');
      }),
    };

    And you may need to read Sequelize - Migrations to learn about how to write Migrations.

    Recommended example

    Questions & Suggestions

    Please open an issue here.

    License

    MIT

    Install

    npm i egg-isequelize

    DownloadsWeekly Downloads

    0

    Version

    2.0.0-beta.3

    License

    none

    Unpacked Size

    12.9 kB

    Total Files

    11

    Last publish

    Collaborators

    • callme-zl