Sequelize 中文文档 v4 - Upgrade to V4 - 升级到 V4

Upgrade to V4 - 升级到 V4

此系列文章的应用示例已发布于 GitHub: sequelize-docs-Zh-CN. 能够 Fork 帮助改进或 Star 关注更新. 欢迎 Star.html

Sequelize V4 是一个重要版本,它引入了新的功能和突破性的变化。 大量的 sequelize 代码库已用 ES2015 功能重构。 如下指南列出了从 v3 升级到 v4 的一些更改。查看 修改日志 查看所有详细列表。node

突破性变化

  • Node 版本: 要使用新的 ES2015 功能,咱们如今至少须要 Node4。从如今开始,咱们将支持全部当前的LTS版本的Node。
  • 计数器缓存插件以及所以关联的计数器缓存选项已被删除。 使用 afterCreateafterDelete 钩子能够实现相同的行为。
  • 删除了MariaDB方言。 这只是围绕 MySQL 的一个浅层包装,因此使用 dialect:'mysql 而不是进一步的改变。
  • 删除默认的 REPEATABLE_READ 事务隔离。 隔离级别如今默认为数据库的级别。 在启动事务时明确地传递所需的隔离级别。
  • 删除了对 pool: false 的支持。要使用单个链接,请将 pool.max 设置为1。
  • (MySQL)当数字太大时,BIGINT 如今被转换为字符串。
  • 删除了对referencesKey的支持,使用了一个引用对象。mysql

    references: {
        key: '',
        model: ''
    }
  • classMethodsinstanceMethods 已被移除。

之前:git

const Model = sequelize.define('Model', {
    ...
}, {
    classMethods: {
        associate: function (model) {...}
    },
    instanceMethods: {
        someMethod: function () { ...}
    }
});

如今:github

const Model = sequelize.define('Model', {
    ...
});

// 类方法
Model.associate = function (models) {
    ...associate the models
};

// 实例方法
Model.prototype.someMethod = function () {..}
  • Model.Instanceinstance.Model 已被移除。要从一个实例访问模型,只需使用 instance.constructor。 示例类 (Model.Instance) 如今是模型自己。
  • Sequelize 如今使用一个 bluebird 库的独立副本.sql

    • sequelize返回的 promise 如今是 Sequelize.Promise 而不是 bluebird 的全局 Promise 实例。
    • CLS 补丁不会影响 bluebird 的全局 promise。当与 Promise.all 和其余 bluebird 方法一块儿使用时,事务不会自动传递给方法。明确地修补 bluebird 实例,可让 CLS 可以使用 bluebird 方法。数据库

      $ npm install --save cls-bluebird
const Promise = require('bluebird');
const Sequelize = require('sequelize');
const cls = require('continuation-local-storage');
const ns = cls.createNamespace('transaction-namespace');
const clsBluebird = require('cls-bluebird');
clsBluebird(ns, Promise);
Sequelize.useCLS(ns);
  • Sequelize.Validator 如今是 validator 库的独立副本
  • DataTypes.DECIMAL 对于 MySQL 和 Postgres 返回的是字符串.
  • DataTypes.DATE 如今使用 DATETIMEOFFSET 而不是 DATETIME2 sql数据类型,以防MSSQL记录时区。要将现有的 DATETIME2 列迁移到 DATETIMEOFFSET 中, 查看 #7201.
  • options.order 如今只接受数组类型或 Sequelize 方法的值。 原限支持的字符串值(即{order:'name DESC'})已被弃用。
  • 使用 BelongsToMany 关系 add / set / create 设置器如今经过将它们传递为 options.through 来设置属性(之前的第二个参数被用做经过属性,如今它被认为是 through 做为子选项的选项)。

之前:npm

user.addProject(project, { status: 'started' })

如今:数组

user.addProject(project, { through: { status: 'started' }})
  • DATEONLY 如今以 YYYY-MM-DD 格式而不是 Date 类型返回字符串
  • Model.validate 实例方法默认运行验证钩子。之前你须要传递 { hooks: true }. 您能够经过传递 { hooks: false } 来覆盖此行为。
  • 当验证失败时,来自 Model.validate 实例方法的结果将被拒绝。 验证成功后才能实现。
  • 原始参数 where, order 和 group 好比 where: { $raw: '..', order: [{ raw: '..' }], group: [{ raw: '..' }] } 删除以防止SQL注入攻击。
  • Sequelize.Utils 再也不是公共API的一部分,使用它本身承担风险。
  • Hooks 如今应返回 promise。 不支持回调。

新功能

  • sequelize.sync({ alter: true }) 的初始版本已添加,并使用 ALTER TABLE 命令来同步表。 迁移 仍然是首选,应在生产中使用。
  • 如今支持添加和删除数据库约束。 现有的 primary,foreignKey 和其余约束如今可使用迁移来添加/删除 - 查看更多.
  • 实例(数据库行)如今是模型的实例,而不是单独类的实例。这意味着你能够替换User.build()new User()sequelize.define(attributes, options)promise

    class User extends Sequelize.Model {}
    User.init(attributes, options)

而后,您能够直接在类中定义自定义方法,类方法和 getter / setter。
这也使得有更多的使用模式,例如用 装饰器.

  • 增长了 DEBUG 支持。 如今可使用 DEBUG = sequelize * node app.js 为全部 sequlize 操做启用日志记录。 要过滤记录的查询,请使用 DEBUG=sequelize:sql:mssql sequelize:connection* 来记录生成的SQL查询,链接信息等。
  • SQLite 添加了 JSON 数据类型支持。
  • UPSERT 如今使用 MERGE 语句支持 MSSQL
  • 事务如今彻底支持 MSSQL
  • MSSQL 方言如今支持过滤的索引。

    queryInterface.addIndex(
      'Person',
      ['firstname', 'lastname'],
      {
        where: {
          lastname: {
            $ne: null
          }
        }
      }
    )

若是这篇文章对您有帮助, 感谢 下方点赞 或 Star GitHub: sequelize-docs-Zh-CN 支持, 谢谢.

相关文章
相关标签/搜索