• Stars
    star
    609
  • Rank 71,239 (Top 2 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 7 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Sequelize for Egg.js

egg-sequelize

Sequelize plugin for Egg.js.

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

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

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

Read the tutorials to see a full example.

  • Enable plugin in config/plugin.js
exports.sequelize = {
  enable: true,
  package: 'egg-sequelize'
}
  • Edit your own configurations in conif/config.{env}.js
exports.sequelize = {
  dialect: 'mysql', // support: mysql, mariadb, postgres, mssql
  database: 'test',
  host: 'localhost',
  port: 3306,
  username: 'root',
  password: '',
  // delegate: 'myModel', // load all models to `app[delegate]` and `ctx[delegate]`, default to `model`
  // baseDir: 'my_model', // load all files in `app/${baseDir}` as models, default to `model`
  // exclude: 'index.js', // ignore `app/${baseDir}/index.js` when load models, support glob and array
  // more sequelize options
};

You can also use the connection uri to configure the connection:

exports.sequelize = {
  dialect: 'mysql', // support: mysql, mariadb, postgres, mssql
  connectionUri: 'mysql://root:@127.0.0.1:3306/test',
  // delegate: 'myModel', // load all models to `app[delegate]` and `ctx[delegate]`, default to `model`
  // baseDir: 'my_model', // load all files in `app/${baseDir}` as models, default to `model`
  // exclude: 'index.js', // ignore `app/${baseDir}/index.js` when load models, support glob and array
  // more sequelize options
};

egg-sequelize has a default sequelize options below

{
    delegate: 'model',
    baseDir: 'model',
    logging(...args) {
      // if benchmark enabled, log used
      const used = typeof args[1] === 'number' ? `[${args[1]}ms]` : '';
      app.logger.info('[egg-sequelize]%s %s', used, args[0]);
    },
    host: 'localhost',
    port: 3306,
    username: 'root',
    benchmark: true,
    define: {
      freezeTableName: false,
      underscored: true,
    },
  };

More documents please refer to Sequelize.js

Model files

Please put models under app/model dir by default.

Conventions

model file class name
user.js app.model.User
person.js app.model.Person
user_group.js app.model.UserGroup
user/profile.js app.model.User.Profile
  • 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: options.delegate default to model, so app.model is an Instance of Sequelize, so you can use methods like: app.model.sync, app.model.query ...

// 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 = async function(login) {
    return await this.findOne({
      where: {
        login: login
      }
    });
  }

  // don't use arraw function
  User.prototype.logSignin = async function() {
    return await this.update({ last_sign_in_at: new Date() });
  }

  return User;
};

Now you can use it in your controller:

// app/controller/user.js
class UserController extends Controller {
  async index() {
    const users = await this.ctx.model.User.findAll();
    this.ctx.body = users;
  }

  async show() {
    const user = await this.ctx.model.User.findByLogin(this.ctx.params.login);
    await user.logSignin();
    this.ctx.body = user;
  }
}

Associate

Define all your associations in Model.associate() and egg-sequelize will execute it after all models loaded. See example below.

Multiple Datasources

egg-sequelize support load multiple datasources independently. You can use config.sequelize.datasources to configure and load multiple datasources.

// config/config.default.js
exports.sequelize = {
  datasources: [
    {
      delegate: 'model', // load all models to app.model and ctx.model
      baseDir: 'model', // load models from `app/model/*.js`
      database: 'biz',
      // other sequelize configurations
    },
    {
      delegate: 'admninModel', // load all models to app.adminModel and ctx.adminModel
      baseDir: 'admin_model', // load models from `app/admin_model/*.js`
      database: 'admin',
      // other sequelize configurations
    },
  ],
};

Then we can define model like this:

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

  return User;
};

// app/admin_model/user.js
module.exports = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;

  const User = app.adminModel.define('user', {
    login: STRING,
    name: STRING(30),
    password: STRING(32),
    age: INTEGER,
    last_sign_in_at: DATE,
    created_at: DATE,
    updated_at: DATE,
  });

  return User;
};

If you define the same model for different datasource, the same model file will be excute twice for different database, so we can use the secound argument to get the sequelize instance:

// app/model/user.js
// if this file will load multiple times for different datasource
// we can use the secound argument to get the sequelize instance
module.exports = (app, model) => {
  const { STRING, INTEGER, DATE } = app.Sequelize;

  const User = model.define('user', {
    login: STRING,
    name: STRING(30),
    password: STRING(32),
    age: INTEGER,
    last_sign_in_at: DATE,
    created_at: DATE,
    updated_at: DATE,
  });

  return User;
};

Customize Sequelize

By default, egg-sequelize will use sequelize@5, you can cusomize sequelize version by pass sequelize instance with config.sequelize.Sequelize like this:

// config/config.default.js
exports.sequelize = {
  Sequelize: require('sequelize'),
};

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
class PostController extends Controller {
  async index() {
    const posts = await 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;
  }

  async show() {
    const post = await this.ctx.model.Post.findByPk(this.params.id);
    const user = await post.getUser();
    post.setDataValue('user', user);
    this.ctx.body = post;
  }

  async destroy() {
    const post = await this.ctx.model.Post.findByPk(this.params.id);
    await post.destroy();
    this.ctx.body = { success: true };
  }
}

Sync model to db

We strongly recommend you to use Sequelize - 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.config.env === 'unittest') {
    app.beforeStart(async () => {
      await app.model.sync({force: true});
    });
  }
};

Migration

Using sequelize-cli to help manage your database, data structures and seed data. Please read Sequelize - Migrations to learn more infomations.

Recommended example

Questions & Suggestions

Please open an issue here.

License

MIT

More Repositories

1

egg

๐Ÿฅš Born to build better enterprise frameworks and apps with Node.js & Koa
JavaScript
18,650
star
2

examples

Store all egg examples in one place
JavaScript
1,748
star
3

awesome-egg

Awesome Egg.js Web Framework and Plugin.
869
star
4

egg-mongoose

JavaScript
437
star
5

egg-graphql

JavaScript
371
star
6

egg-mysql

MySQL plugin for egg
TypeScript
328
star
7

egg-ant-design-pro

showcase for Egg loves Ant Design
JavaScript
318
star
8

egg-redis

redis plugin for egg
JavaScript
267
star
9

egg-validate

validate plugin for egg
JavaScript
259
star
10

egg-security

Security plugin for egg, force performance too.
JavaScript
237
star
11

egg-socket.io

socket.io plugin for eggjs.
JavaScript
237
star
12

egg-cluster

cluster manager for egg
JavaScript
218
star
13

egg-core

A core Pluggable framework based on koa.
JavaScript
217
star
14

tegg

Strong Type framework with eggjs.
TypeScript
185
star
15

egg-bin

egg developer tool
TypeScript
183
star
16

egg-multipart

multipart plugin for egg
JavaScript
166
star
17

egg-ts-helper

๐Ÿณ Generate TypeScript definition files(d.ts) for Egg
TypeScript
157
star
18

egg-init

Init egg app helper tools
JavaScript
151
star
19

egg-view-vue

vue view plugin for egg
JavaScript
150
star
20

egg-cors

CORS plugin for egg
JavaScript
150
star
21

egg-logger

Egg logger
JavaScript
150
star
22

vscode-eggjs

vscode extension for https://eggjs.org/
TypeScript
145
star
23

egg-mock

Mock library for egg testing.
JavaScript
144
star
24

egg-router-plus

The missing router feature for eggjs
JavaScript
140
star
25

egg-scripts

deploy tool for egg projects
JavaScript
112
star
26

egg-rest

Restful API plugin for egg
JavaScript
107
star
27

egg-passport

passport plugin for egg
JavaScript
106
star
28

egg-view-react

egg view plugin for react
JavaScript
89
star
29

egg-view-nunjucks

nunjucks view plugin for egg
JavaScript
89
star
30

egg-static

static server plugin for egg
JavaScript
89
star
31

egg-schedule

Schedule plugin for egg
JavaScript
88
star
32

egg-oss

aliyun oss plugin for egg
JavaScript
87
star
33

egg-grpc

grpc plugin for egg
JavaScript
81
star
34

egg-sofa-rpc

SOFARPC plugin for egg
JavaScript
80
star
35

egg-userrole

user role plugin for egg
JavaScript
77
star
36

eslint-config-egg

Node Style Guide for Egg.
JavaScript
67
star
37

egg-view-ejs

egg view plugin for ejs.
JavaScript
64
star
38

egg-onerror

error handler for egg
Mustache
56
star
39

egg-alinode

alinode plugin for egg
JavaScript
54
star
40

egg-logrotator

Log rotate plugin for egg
JavaScript
53
star
41

egg-view-assets

Manage frontend assets in development and production.
JavaScript
52
star
42

egg-router

router for eggjs, fork from koa-router with some additional features
JavaScript
50
star
43

egg-orm

Object relational mapping for Egg framework
JavaScript
49
star
44

aliyun-egg

node web framework for aliyun, base on eggjs
JavaScript
49
star
45

egg-cancan

cancancan like authorization plugin for Egg.js
JavaScript
48
star
46

egg-session

session plugin for egg
JavaScript
47
star
47

egg-healthy

Liveness and Readiness health check for egg application
JavaScript
45
star
48

egg-passport-local

wrap passport-local strategy for egg-passport
JavaScript
45
star
49

egg-aop

AOP plugin for eggjs, add DI, AOP support.
TypeScript
44
star
50

egg-session-redis

redis store for egg session
JavaScript
43
star
51

egg-showcase-aliyun-blog

A blog showcase for aliyun-egg
JavaScript
42
star
52

egg-view

JavaScript
41
star
53

jar2proxy

transfer java facade jar to proxyjs
Java
41
star
54

egg-dubbo-rpc

dubbo rpc plugin for egg
JavaScript
40
star
55

egg-boilerplate-ts

Boilerplate for egg typescript project
TypeScript
40
star
56

egg-i18n

i18n plugin for egg
JavaScript
39
star
57

doctools

doctools for eggjs
JavaScript
38
star
58

egg-prometheus

Prometheus plugin for Egg.js
JavaScript
38
star
59

egg-http-proxy

http proxy for egg
JavaScript
38
star
60

egg-cloud

egg cloud provider tools for developers to quickly build some of the common patterns in distributed systems
JavaScript
38
star
61

egg-rpc-generator

RPC tools for egg framework
JavaScript
37
star
62

egg-errors

Errors for Egg.js.
TypeScript
31
star
63

egg-dingtalk

egg plugin for dingtalk
JavaScript
30
star
64

egg-cookies

cookies module for egg, base on pillarjs/cookies
JavaScript
30
star
65

egg-rpc

rpc plugin for eggjs
JavaScript
29
star
66

egg-tracer

tracer plugin for egg
JavaScript
29
star
67

create-egg

so you could use `npm init egg showcase` to init egg project
JavaScript
28
star
68

docker

Egg official docker image
JavaScript
27
star
69

egg-websocket

egg plugin for websocket
JavaScript
26
star
70

egg-path-matching

url path match/ignore support string, regexp and function
JavaScript
26
star
71

egg-lru

egg lru-cache plugin
JavaScript
25
star
72

egg-boilerplate-microservice

Boilerplate for egg microservice project
JavaScript
25
star
73

egg-watcher

Watcher plugin for egg
JavaScript
25
star
74

egg-parameters

Merge all parameters (ctx.params, ctx.request.query, ctx.request.body) into ctx.params like Rails application.
JavaScript
24
star
75

egg-development-proxyagent

[DEPRECATED] A proxy adapter for debugging httpclient on egg.
JavaScript
21
star
76

egg-userservice

userservice plugin for egg
JavaScript
21
star
77

egg-zookeeper

egg plugin for zookeeper
JavaScript
20
star
78

benchmark

benchmark for egg
JavaScript
20
star
79

egg-opentracing

Implementation of opentracing in Egg.js
JavaScript
19
star
80

egg-datahub

Macaca DataHub plugin for Egg.js
JavaScript
19
star
81

egg-ons

aliyun ons plugin for egg
JavaScript
18
star
82

egg-validate-schema

validate by json-schema plugin for egg
JavaScript
17
star
83

egg-development-proxyworker

**[DEPRECATED]** A proxy worker for debugging worker on egg
JavaScript
17
star
84

egg-boilerplate-simple

Boilerplate for egg simple project
JavaScript
16
star
85

eggjs.github.io

eggjs docs site
JavaScript
16
star
86

egg-logger-sls

Logger transport for aliyun sls.
JavaScript
15
star
87

egg-logview

Provide a log files viewer for development purpose.
JavaScript
15
star
88

egg-ci

Auto gen ci config file
JavaScript
15
star
89

egg-jsonp

jsonp support for egg, with security check inside
JavaScript
14
star
90

egg-boilerplate-plugin

Boilerplate for egg plugin
JavaScript
14
star
91

koa-express-adapter

The adapter for the migration from express to koa
JavaScript
14
star
92

egg-boilerplate-alipay-tiny

ๆ”ฏไป˜ๅฎๅฐ็จ‹ๅบๆœๅŠก็ซฏ่„šๆ‰‹ๆžถ
JavaScript
14
star
93

egg-view-handlebars

egg view plugin for handlebars
JavaScript
12
star
94

egg-passport-github

github passport plugin for egg
JavaScript
11
star
95

egg-leancloud

leancloud plugin for Egg.js
JavaScript
11
star
96

egg-instrument

Compute the duration of an operation in local environment.
JavaScript
11
star
97

egg-utils

Utils for all egg projects.
TypeScript
11
star
98

egg-tslint-to-eslint

Migrate tslint-config-egg to eslint-config-egg in ts project.
JavaScript
9
star
99

egg-lookout

SOFALookout plugin for egg
JavaScript
9
star
100

egg-host

A host plugin for egg. It supports modify the host config, just like edit the /etc/hosts.
JavaScript
9
star