【问题标题】:waterline-model.create - primaryKeywaterline-model.create - primaryKey
【发布时间】:2015-04-09 08:11:21
【问题描述】:

我有以下带有主键 ID 的模型:

attributes: {
   id: {
      type: 'integer',
      autoIncrement: true,
      primaryKey: true,
      unique: true
   },
    name: {
      type: 'string',
      unique: true,
      required: true
   },
}

我正在创建如下模型:

var model = {
     id: undefined,
     name: 'name',
};

waterlinemodel.create(model).exec(function(error, result) {});

但它会引发以下错误: 错误 (E_UNKNOWN) 遇到意外错误] 详细信息:错误:“id”列中的空值违反非空约束

既然 'id' 是主键,waterline 不应该看 'id' 属性的值是什么。

如何解决这个错误?我不想删除“id”,因为我已经为模型创建了值对象,它包含模型的所有属性。我正在根据需要设置值对象属性。我不需要为创建设置 id 属性。

【问题讨论】:

  • 如果你不需要设置id属性,或者没有理由要分配自己的主键id,为什么要这样做?如果没有明确告知不要这样做,则将自动分配主键。删除“id: undefined”可能就行了。
  • 根据java脚本。如果我没有定义 id 或者我将值赋值为 undefine 两者都是相同的。仍然水线给出错误。
  • 使用 autoPK = true?根据您在下面的回复,autoPK 是错误的,因此您必须提供有效的 ID。如果将 autoPK 设置为 true,则不必定义一个(可以省略 id 属性)。

标签: database node.js sails.js waterline


【解决方案1】:

我遇到了完全相同的问题,尤其是配置为使用 postgresql 的模型。将其设置为磁盘或内存时,会创建资源,但使用 postgresql 时不会创建资源,并出现非空约束错误。

无论我是否设置autoPK: true,都不会设置id。即使用autoPK:false在模型上设置id属性也不起作用。

【讨论】:

    【解决方案2】:

    正如文档所说:

    Will set the primary key of the record. This should be used when autoPK is set to false.
    
    attributes: {
      uuid: {
        type: 'string',
        primaryKey: true,
        required: true
      }
    }
    

    你需要在你的模型上设置autoPK : false

    文档链接:https://github.com/balderdashy/waterline-docs/blob/master/models.md#primarykey

    【讨论】:

    • 阅读问题并从质量判断我认为他无意设置自己的主键。根据我的阅读,他应该将 autoPK 设置为 true 并简单地删除 id: undefined 以让系统生成他的主键。
    • 所以它也必须删除 primaryKey:true
    • 您是否尝试完全删除 id: undefined ?像 var model = { name: 'name' };
    • 这就是问题所在,我不想从模型中删除 id: undefined,
    【解决方案3】:

    2019 年答案

    jaumard 的文档链接现在出现 404 错误,但我认为自 2015 年以来情况可能发生了变化...

    Sails.js 在config/models.js 中定义了基本属性,在新生成的项目中看起来像这样:

    attributes: {
      createdAt: { type: 'number', autoCreatedAt: true, },
      updatedAt: { type: 'number', autoUpdatedAt: true, },
      id: { type: 'number', autoIncrement: true, },
    }
    

    另外,默认primaryKey 设置为id。如果您想覆盖它,则需要在完整模型定义中明确指定新的primaryKey。例如,如果你想让name 成为你的primaryKey,你可以使用这样的东西:

    module.exports = {
      primaryKey: 'name',
      attributes: {
        name: {
          type: 'string',
          unique: true,
          required: true
        },
        // ...
      },
    }
    

    请注意,我将primaryKey 放在attributes 之外。这个很重要。您的 primaryKey 还需要 uniquerequired 约束。

    此外,如果您想禁用 id 列以便它不会提交到您的数据库,您必须将 id 替换为值 false -- 但是您必须定义一个不同的primaryKey 否则当你启动你的应用程序时你会得到一个错误。问题中显示的错误可能与模型将id明确定义为undefined这一事实直接相关。如何禁用id 的示例如下所示:

    module.exports = {
      primaryKey: 'name',
      attributes: {
        id: false,
        name: {
          type: 'string',
          unique: true,
          required: true
        },
        // ...
      },
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-19
      • 2021-07-27
      • 2018-06-07
      • 2014-11-29
      • 2017-01-30
      • 1970-01-01
      • 2018-01-15
      • 2018-05-21
      相关资源
      最近更新 更多