簡體   English   中英

(添加SQL)將hasMany與選項關聯

[英](Added SQL) Sequelize hasMany association with option

我是Sequelize的新手,正在學習官方教程網站( http://docs.sequelizejs.com/manual/tutorial/ ),但在嘗試教程中的代碼時遇到了麻煩。

我嘗試的代碼是這樣的:

 const City = sequelize.define('city', { countryCode: Sequelize.STRING }); const Country = sequelize.define('country', { isoCode: Sequelize.STRING }); Country.hasMany(City, {foreignKey: 'countryCode', sourceKey: 'isoCode'}); City.belongsTo(Country, {foreignKey: 'countryCode', targetKey: 'isoCode'}); sequelize.sync(); 

當我運行此代碼時,節點控制台會給我一個錯誤:

“未處理的拒絕SequelizeDatabaseError:無法添加外鍵約束。在引用表'countries'中缺少約束'cities_ibfk_1'的索引”

有人可以告訴我這是什么問題嗎? 非常感謝您的幫助。 謝謝。

上面的代碼是從教程(的一部分Assotiation http://docs.sequelizejs.com/manual/tutorial/associations.html )一對多關聯。


我還附上了Sequelize自動生成的代碼:

CREATE TABLE IF NOT EXISTS `countries` (
  `id` INTEGER NOT NULL auto_increment ,
  `isoCode` VARCHAR(255),
  `createdAt` DATETIME NOT NULL,
  `updatedAt` DATETIME NOT NULL,
  PRIMARY KEY (`id`))
  ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `cities` (
  `id` INTEGER NOT NULL auto_increment ,
  `createdAt` DATETIME NOT NULL,
  `updatedAt` DATETIME NOT NULL,
  `countryCode` VARCHAR(255),
  PRIMARY KEY (`id`),
  FOREIGN KEY (`countryCode`) REFERENCES `countries` (`isoCode`)
  ON DELETE SET NULL ON UPDATE CASCADE)
  ENGINE=InnoDB;

乍一看,似乎SQL語法在這里不是錯誤的,但是無論如何都會導致錯誤。 任何人都可以找出問題所在嗎? 還是這是續集的問題?

發生此錯誤的原因是Sequelize教程中的示例代碼存在語法錯誤。

如果要為外鍵制定規則,則它必須引用被引用表的主鍵。 問題是,在代碼中,外鍵countryCode試圖引用isoCodeCountry模型(這是countries表中實際MySQL數據庫)。

const City = sequelize.define('city', { countryCode: Sequelize.STRING });
const Country = sequelize.define('country', { isoCode: Sequelize.STRING });

Country.hasMany(City, {foreignKey: 'countryCode', sourceKey: 'isoCode'});
City.belongsTo(Country, {foreignKey: 'countryCode', targetKey: 'isoCode'});

上面的Sequelize代碼將轉換為如下的SQL語句:

CREATE TABLE IF NOT EXISTS `countries` (
  `id` INTEGER NOT NULL auto_increment ,
  `isoCode` VARCHAR(255),
  `createdAt` DATETIME NOT NULL,
  `updatedAt` DATETIME NOT NULL,
  PRIMARY KEY (`id`))
  ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `cities` (
  `id` INTEGER NOT NULL auto_increment ,
  `createdAt` DATETIME NOT NULL,
  `updatedAt` DATETIME NOT NULL,
  `countryCode` VARCHAR(255),
  PRIMARY KEY (`id`),
  FOREIGN KEY (`countryCode`) REFERENCES `countries` (`isoCode`)
  ON DELETE SET NULL ON UPDATE CASCADE)
  ENGINE=InnoDB;

為了使這個語法錯誤固定的,我們必須做出isoCodeCity模型中的主鍵。 讓我們修復代碼:

const City = sequelize.define('city', { countryCode: Sequelize.STRING})
const Country = sequelize.define('country', {
  isoCode: {
    type: Sequelize.STRING,
    primaryKey: true
  }
})
// ... the rest of code followed below

固定模型定義后,代碼將按預期工作!

但是我想知道的是... 官方教程如何發布此代碼,讓初學者只是在不知道這行不通的情況下嘗試一下。 當然,有人會說這不是Sequelize的問題,而是理解SQL的問題。 但是我仍然認為該教程應該固定以避免這種情況的發生。


該解決方案的局限性在於,沒有必要使用選項sourceKeytargetKey ,因為即使沒有它們,Sequelize也會自動找出關系並識別表中的源鍵和目標鍵。

仍然我不明白這一點……我想現在,我只需要不使用sourceKey和targetkey選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM