# 安装插件

egg-sequelize

sequelize 是一个广泛使用的 ORM 框架,它支持 MySQL、SQLite 和 MSSQL 、PostgreSQL等多个数据源

$ npm install egg-sequelize --save

在 config/plugin.js 中引入 egg-sequelize 插件

sequelize: {
  enable: true,
  package: 'egg-sequelize',
};

在 config/config.default.js 中编写 sequelize 配置

exports.sequelize = {
  dialect: 'mysql',  // support: mysql, mariadb, postgres, mssql
  host: '127.0.0.1',
  port: 3306,
  database: 'egg-sequelize-doc-unittest', // /数据库名
};

mysql2

在 Web 应用方面 MySQL 是最常见,最好的关系型数据库之一。非常多网站都选择 MySQL 作为网站数据库。

$ npm install mysql2 --save

sequelize-cli

sequelize 提供了 sequelize-cli 工具来实现 Migrations,我们也可以在 egg 项目中引入 sequelize-cli。

$ npm install --save-dev sequelize-cli

在 egg 项目中,我们希望将所有数据库 Migrations 相关的内容都放在 database 目录下,所以我们在项目根目录下新建一个 .sequelizerc 配置文件:

const path = require('path');

module.exports = {
  config: path.join(__dirname, 'database/config.json'),
  'migrations-path': path.join(__dirname, 'database/migrations'),
  'seeders-path': path.join(__dirname, 'database/seeders'),
  'models-path': path.join(__dirname, 'app/model'),
};

初始化 Migrations 配置文件和目录

$ npx sequelize init:config
$ npx sequelize init:migrations

执行完后会生成 database/config.json 文件和 database/migrations 目录,我们修改一下 database/config.json 中的内容,将其改成我们项目中使用的数据库配置:

{
  "development": {
    "username": "root",  // 账号
    "password": null,    // 密码
    "database": "egg-sequelize-doc-default", // 数据库名
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "egg-sequelize-doc-unittest",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

sequelize-auto

利用 sequelize-auto 对照数据库自动生成相应的models,使用sequelize-auto对照数据库自动生成相应的models减少了对数据库进行增删改查时的sql语句的编写

$ npm install --save-dev egg-sequelize-auto

egg-sequelize-auto -o ./app/model -h localhost -p 3306 -d [数据库] -u [用户名] -x [密码|'']

# 初始化数据库

利用我们定义的快捷命令我们可以很方便的创建我们所需要文件:

$ npm run db:init

然后把文件内容更改成以下内容:

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    const { INTEGER, STRING  } = Sequelize
    await queryInterface.createTable('users', {
      id: {
        type: INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: true,
        comment: '唯一索引',
      },
      phone: {
        type: STRING(11),
        unique: true,
        allowNull: true,
        comment: '手机号',
      },
      password: {
        type: STRING,
        allowNull: true,
        comment: '密码',
      },
      name: {
        type: STRING(50),
        allowNull: false,
        comment: '昵称',
      },
      avatar: {
        type: STRING,
        allowNull: true,
        comment: '头像',
      }
    })
  },

  down: async queryInterface => {
      await queryInterface.dropTable('users');
  }
};

# 数据库变更

执行下方命令之后,我们的数据库初始化就完成了

$ npm run db:up
// 升级数据库 `npm run db:up`
"db:up": "npx sequelize db:migrate && npm run db:model"
// 需要回滚,可以通过 `npm run db:down` 回退一个变更
"db:down": "npx sequelize db:migrate:undo"
// 可以通过 `npm run db:down-all` 回退到初始状态
"db:down-all": "npx sequelize db:migrate:undo:all"

并且会在model目录下帮我们创建 users 这个 model,如下:

/* indent size: 2 */

module.exports = app => {
  const DataTypes = app.Sequelize;

  const Model = app.model.define('users', {
    id: {
      type: DataTypes.INTEGER(11),
      allowNull: true,
      primaryKey: true,
      autoIncrement: true
    },
    phone: {
      type: DataTypes.STRING(11),
      allowNull: true,
      unique: true
    },
    password: {
      type: DataTypes.STRING(255),
      allowNull: true
    },
    name: {
      type: DataTypes.STRING(50),
      allowNull: false
    },
    avatar: {
      type: DataTypes.STRING(255),
      allowNull: true
    }
  }, {
    tableName: 'users'
  });

  Model.associate = function() {

  }

  return Model;
};

这个 Model 就可以在 Controller 和 Service 中通过 app.model.Users 或者 ctx.model.Users 访问到了

阅读全文