egg-sequelize






    用法 & 配置

    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 dbundo"
      6. }
      7. }

    更多文档请访问

    模型文件

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

    • 表总是会有时间戳字段: created_at datetime, updated_at datetime
    • 使用下划线风格的列明, 例如: user_id, comments_count

    示例

    首先定义一个模型。

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

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

    完整的示例

    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. * show() {
    13. const post = yield this.ctx.model.Post.findById(this.params.id);
    14. post.setDataValue('user', user);
    15. this.ctx.body = post;
    16. }
    17. * destroy() {
    18. const post = yield this.ctx.model.Post.findById(this.params.id);
    19. yield post.destroy();
    20. this.ctx.body = { success: true };
    21. }
    22. }
    23. }

    将模型同步到数据库中

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

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

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

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

    例如:

    1. $ npm run migrate:up
    1. $ EGG_SERVER_ENV=unittest npm run migrate:up

    或者在 prod环境下:

    1. $ EGG_SERVER_ENV=prod 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. };

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

    推荐的示例

    问题 & 建议

    MIT