Sequelize:更改列的“validate”元数据

9

是否可以使用迁移文件更改列的“验证”元数据?我尝试了queryInterface.changeColumn方法,似乎只能更改文档中提到的三个元数据(defaultValue、allowNull和type)。

我尝试在迁移文件的'up'对象中执行以下操作:

queryInterface.changeColumn(
  'tableName',
  'columnName',
  {
    validate: {
      is: /new_regex_validation/
    }
  }
)

然而,当我运行“sequelize db:migrate”时,上述尝试对我无效。
为了简单起见,我将使用表定义来阐述我的问题:
我正在尝试像这样更改一个已经存在的表:
var tableName = sequelize.define('tableName', {
    columnName: {
        type: DataTypes.STRING,
        unique: true,
        allowNull: false,
        validate: {
            is: /some_regex_validation/
        }
    }
})

使用sequelize migration将其转换为以下内容:
var tableName = sequelize.define('tableName', {
    columnName: {
        type: DataTypes.STRING,
        unique: true,
        allowNull: false,
        validate: {
            is: /a_new-or-different_regex_validation/
        }
    }
})

或者在使用sequelize迁移时简单地删除验证元数据:
var tableName = sequelize.define('tableName', {
    columnName: {
        type: DataTypes.STRING,
        unique: true,
        allowNull: false
    }
})

有什么想法吗?
2个回答

12

验证是在客户端进行的,而不是在数据库中进行的。你不需要为此进行迁移。


感谢您的回答!通过编辑模型文件的验证元数据进行确认,它可以工作!:D - JV Estolas
我会通过澄清验证发生在服务器层而不是数据库层来改进这个答案,因此我们不需要告诉我们的数据库(通过迁移)我们正在验证什么。 - Alejandro Corredor
1
点赞!这个回答仍然有效吗?只是好奇,这是否意味着所有验证条款都只添加在模型文件中而不是迁移文件中? - PirateApp
这是不是意味着我们不需要在后端进行任何验证 :/ 这个答案需要被踩而不是赞。 - Abdulhaq Shah

0

我在尝试理解使用验证和迁移构建模型之间的差异时,多次遇到了这个问题。 我发现这个链接非常有帮助,希望将来有其他人也能受益。

验证和约束之间的区别

验证是在 Sequelize 级别上进行的检查,使用纯 JavaScript。如果您提供自定义验证器函数,则它们可以任意复杂,也可以是 Sequelize 提供的内置验证器之一。如果验证失败,则不会向数据库发送任何 SQL 查询。

另一方面,约束是在 SQL 级别上定义的规则。最基本的约束示例是唯一约束。如果约束检查失败,则数据库会抛出错误,并且 Sequelize 将此错误转发到 JavaScript(在此示例中,抛出 SequelizeUniqueConstraintError)。请注意,在这种情况下,执行了 SQL 查询,与验证的情况不同。

https://sequelize.org/master/manual/validations-and-constraints.html


1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。-【来自审查】 - David Buck
谢谢。我添加了一个编辑部分,这让我更容易理解了。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接