当前位置: 首页 > 知识库问答 >
问题:

在外键列中设置值时出现问题

孙翰墨
2023-03-14

我使用squeelize.js和SQLite-database,遇到了一个为外键设置值的问题。我有以下代码:

const MessageModel = sequelize.define('MessageModel ', {
    uuid: DataTypes.STRING,
    authorId: DataTypes.STRING,
    // ... other props
  }, {});

const TodoModel = sequelize.define('TodoModel', {
    ownerId: DataTypes.STRING,
    status: {
      type: DataTypes.STRING,
      defaultValue: 'pending'
    }
  }, {});

TodoModel.belongsTo(MessageModel , {
    foreignKey: {
        name: 'messageId',
        field: 'messageId',
        allowNull: false
    },
    targetKey: 'uuid'
});

MessageModel.create({
   uuid: 'testUUIDForExample'
   // other props
}).then(message => {

   console.log(`Message's created successful`);

   TodoModel.create({
      ownerId: 'id-string',
      status: 'test-status',
      messageId: 'testUUIDForExample'
   })
})

Sequelize在DB中创建MessageModel-row,但当它试图生成TodoModel时,它会出现以下错误:

DatabaseError: SQLITE_ERROR: foreign key mismatch - "TodoModel" referencing "MessageModel "
    at Query.formatError (C:\Users\lrsvo\web-development\projects\platoon-web-electron\node_modules\sequelize\lib\dialects\sqlite\query.js:432:16)
    at Query._handleQueryResponse (C:\Users\lrsvo\web-development\projects\platoon-web-electron\node_modules\sequelize\lib\dialects\sqlite\query.js:77:18)
    at afterExecute (C:\Users\lrsvo\web-development\projects\platoon-web-electron\node_modules\sequelize\lib\dialects\sqlite\query.js:260:31)
    at Statement.errBack (C:\Users\lrsvo\web-development\projects\platoon-web-electron\node_modules\sqlite3\lib\sqlite3.js:16:21)

Err.original.message: "SQLITE_ERROR: foreign key mismatch - "TodoModel" referencing "MessageModel"

生成得SQL:

"INSERT INTO `TodoModel` (`id`,`ownerId`,`status`,`createdAt`,`updatedAt`,`messageId`) VALUES (NULL,$1,$2,$3,$4,$5);"

我的TodoModel表如下所示:

CREATE TABLE "TodoModel" (
    "id"            INTEGER PRIMARY KEY AUTOINCREMENT,
    "ownerId"   VARCHAR(255),
    "status"    TEXT DEFAULT 'pending',
    "createdAt" DATETIME NOT NULL,
    "updatedAt" DATETIME NOT NULL,
    "messageId" VARCHAR(255) NOT NULL,
    FOREIGN KEY("messageId") REFERENCES "MessageModel"("uuid") ON DELETE NO ACTION ON UPDATE CASCADE
);

我在SQLite中使用了“sequelize”:“^5.1.0”。

MyConfig文件:

const Sequelize = require("sequelize");
const electron = require('electron');
const storagePath = electron.app.getPath('userData') + '/plt.db';

module.exports = {
  development: {
    dialect: "sqlite",
    storage: storagePath,
    username: null,
    password: null,
    operatorsAliases: Sequelize.Op,
    define: { freezeTableName: true },
    query: { raw: true }, // Always get raw result
    logging: true,
  },
};

共有1个答案

贺俊材
2023-03-14

这里有许多东西。首先,如果要在MessageModel上使用uuid作为主键,则必须定义它,否则将有一个默认的id字段。

const MessageModel = sequelize.define('MessageModel ', {
  uuid:{ // if this is your primary key you have to define it
    type: DataTypes.STRING,  //there is also DataTypes.UUID
    allowNull: false,
    primaryKey: true,
    unique: true
  }, 
  authorId: DataTypes.STRING,
  // ... other props
}, {});

然后在TodoModel上,将messageid关联设置为Integer。要将其更改为string,必须在模型上定义字段,并在关联上将其用作外键。

const TodoModel = sequelize.define('TodoModel', {
  ownerId: DataTypes.STRING,
  status: {
    type: DataTypes.STRING,
    defaultValue: 'pending'
  },
  messageId: { //you also have to add the field on your model and set it as STRING, because on the association Sequelize by default is going to use INTEGER
    type: DataTypes.STRING,
    allowNull: false
  }
}, {});

TodoModel.belongsTo(MessageModel , {
  as: 'Message',
  foreignKey: 'messageId', // and you only set the foreignKey - Same name as your field above
});
 类似资料:
  • 我使用的是Ruby on Rails V3.2.2。我想解决在使用和RoR方法时与外键验证相关的问题。也就是说,我有以下模型类: 但是,如果我注释掉模型类中的,它会按预期工作,但是不验证外键似乎不是一个正确的方法。 如果我注释掉模型类中的,我仍然会得到错误:

  • 问题内容: 我正在使用phpMyAdmin建立数据库。我有两个表(和), 在它们的主键上建立了索引 。我正在尝试使用它们的主键作为外键在它们之间创建一个关系表()。 我将这些表创建为MyISAM,但是后来将这三个表都更改为InnoDB,因为我读到MyISAM不支持外键。所有字段均为。 当我选择表格时,单击“关系视图”链接,然后尝试将FK列设置为和,它显示 “未定义索引!” 每列旁边。 我想念什么?

  • 问题内容: 我有一个Redis设置键’a’和值‘1’,‘2’,‘3’。是否可以为集合中的每个键值对设置不同的到期时间。 例如,(’a’,‘1’)应该在60秒后过期,而as(’a’,‘2’)应该在120秒后过期。 问题答案: 抱歉不行。Redis的“容器”(即列表,哈希,集合和排序集合)不支持按成员过期,尽管过去多次要求使用此功能。 但是,您可以实现自己的逻辑以实现该结果。解决此问题的方法有几种-

  • 我刚开始使用以下模板制作一个简单的cljs应用程序: 我希望在cljs开发中使用苹果酒中的REPL,就像我通常在普通clj项目中使用的一样,因此我做了一些研究,最后得出以下结论: https://github.com/bhauman/lein-figwheel/wiki/Using-the-Figwheel-REPL-within-NRepl 我通读了说明,并验证了所有正确的依赖关系都在项目中。c

  • 我知道对你们大多数人来说,这可能是一个简单的错误,但我找不到任何答案或我面临的问题的线索,主要原因是我对是新手,我与错误消息或这些消息告诉我的任何东西都不相关。 当我尝试运行像hello world这样的基本代码时,它首先打印这一行 “/library/java/javavirtualmachines/jdk-11.0.1.jdk/contents/home/bin/java”-javaagent

  • 我对这段代码有一个问题: 当我保存它时,我会得到以下错误代码: 未捕获的ReferenceError:未定义birthDate 因此,基本上我正在训练获取值“05June 2001”,以便将其作为参数传递给Date函数,但我不能这样做,不过我可以从浏览器控制台访问该值,在那里我确实犯了错误,并提前表示感谢。