Sequelizejs中的外键始终为null

时间:2015-10-24 23:09:32

标签: mysql node.js sequelize.js

我的模特:

module.exports = function(sequelize, DataTypes){
var Podcast = sequelize.define('Podcast', {
  id:  { type: DataTypes.INTEGER, primaryKey: true,autoIncrement: true},
  title: DataTypes.STRING(400),
  description: DataTypes.STRING(2000),
  img: DataTypes.STRING,
  feed: {type: DataTypes.STRING, unique: true},
  home: DataTypes.STRING
})
return Podcast;
}

module.exports = function(sequelize, DataTypes){
var PodcastEntry = sequelize.define('PodcastEntry', {
  id:  { type: DataTypes.INTEGER, primaryKey: true,autoIncrement: true},
  title: DataTypes.STRING(400),
  summary: DataTypes.STRING(2000),
  pubdate: DataTypes.DATE,
  guid: {type: DataTypes.STRING(400)},
  link: {type: DataTypes.STRING(400)},
  length: DataTypes.INTEGER
})
return PodcastEntry;
}

设置关系:

db.Podcast.hasMany(db.PodcastEntry);
db.PodcastEntry.belongsTo(db.Podcast);

插入值:

var Podcast = {};
db.Podcast.findOrCreate({
        where: {
            title: meta.title,
            feed: url
        },
        defaults: {
            description: meta.description,
            img: meta.image.url,
            home: meta.link
        }
    })
    .spread(function(podcast, created) {
        Podcast = podcast;
        log.info(podcast.title + " created " + created);
    });
while (item = stream.read()) {
    db.PodcastEntry.findOrCreate({
        where : {
            PodcastId: Podcast.id,
            guid: item.guid
        },
        defaults: {
            title: item.title,
            summary: item.summary,
            pubdate: new Date(item.pubdate),
            link: item.enclosures[0].url,
            length: item.enclosures[0].length,
            PodcastId: Podcast.id
        }})
        .spread(function(podcastEntry, created){
            log.info(podcastEntry.title + " created " + created);
        });
   }

播客条目是在我的数据库中创建的,但问题是外键'PodcastId'(自动创建)始终为NULL

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您正在创建与创建Podcast记录相同的范围内创建PodcastEntry记录。因此,在读取流时,Podcast变量尚未设置为插入的记录。只有在sequelize完成插入Podcast记录后,才应该创建创建PodcastEntry记录的代码。

db.Podcast.findOrCreate({
  where: {
    title: meta.title,
    feed: url
  },
  defaults: {
    description: meta.description,
    img: meta.image.url,
    home: meta.link
  }
})
.spread(function(podcast, created) {
  Podcast = podcast;
  log.info(podcast.title + " created " + created);

  while (item = stream.read()) {
    db.PodcastEntry.findOrCreate({
      where : {
        PodcastId: Podcast.id,
        guid: item.guid
      },
      defaults: {
        title: item.title,
        summary: item.summary,
        pubdate: new Date(item.pubdate),
        link: item.enclosures[0].url,
        length: item.enclosures[0].length,
        PodcastId: Podcast.id
      }
    })
    .spread(function(podcastEntry, created){
      log.info(podcastEntry.title + " created " + created);
    });
   }

});