首页 > 解决方案 > Sequelize 使用 uuid_generate_v4 设置默认值会给出语法错误

问题描述

我一直在遵循 SO 建议,描述如何在 Postgres 数据库中使用带有 Sequelize 的 uuid,并定义模型以生成 uuid 默认值。它在这里引用了这篇文章。

该建议需要uuid-ossp扩展。我已经验证它已安装并在调用该函数的数据库上使用 SELECT 工作,并且还验证了扩展是“创建的”。所以数据库可以进行调用。

这篇文章建议像我在这段代码片段中所做的那样定义模型:

public_id: {
  field:        'public_id',
  type:         Sequelize.UUID,
  allowNull:    false,
  defaultValue: Sequelize.literal('uuid_generate_v4()'),
},

当我运行代码来创建表(将数据库与模型同步)时,我从 Sequelize 中得到一个错误:

Error: Invalid value Literal { val: 'uuid_generate_v4()' }

我调试到 Sequelize 中node_modules,失败在sql_string.js这里:

if (!val.replace) {
  throw new Error(`Invalid value ${logger.inspect(val)}`);
}

因为replace是 undefined on valuuid_generate_v4()在我的情况下。有趣的事实:无论我在引号中加上什么,我都会得到同样的错误

我认为我按照文章所述做的一切都是正确的。我错过了什么愚蠢的东西吗?

找到根本原因 的更新 对于任何未来的读者来说,好消息是这里给出的模型定义代码完全正确的。所以捕捉到k。罗德曼曼尼克斯

问题根本不在于。我的比简单示例代码复杂得多的代码在某一时刻将 Sequelize 模型定义创建为对象,然后将它们传递给defineSequelize 方法。奇怪的是,定义模型的代码在一个文件夹中使用了 Sequelize 安装,然后(由于配置错误),执行该模型define的 Sequelize 使用了安装在不同文件夹中的 Sequelize。

在 Sequelize 代码的深处,它执行了一个 Javascript instanceof,它看到对象的两个不同“源”并返回一个 false-y 值。一旦我弄清楚了,只需清理项目文件夹即可使一切正常。

标签: postgresqlsequelize.jsuuid

解决方案


推荐阅读