ER_DUP_ENTRY甚至在使用SELECT检查密钥是否存在之后

时间:2016-03-19 14:54:43

标签: javascript mysql node.js asynchronous

感谢您抽出宝贵时间阅读我的问题。

我有一个包含记录的数组,我希望从NodeJS将其放入MYSQL数据库。这些记录有一个我想要UNIQUE的jobkey字段,但我不希望它是PRIMARY KEY,因为jobkey来自API,我想使用我自己的recid来更好地索引和排序。

我正在使用NodeJS首先检查jobkey是否存在,方法是执行SELECT WHERE并检查rows.length> 0?如果jobkey尚不存在,则添加作业。出于某种原因,我一直收到ER_DUP_ENTRY错误,我无法弄清楚为什么我的rows.length有时候=== 0,即使jobkey存在。我已经在墙上撞了几天。我希望这不仅仅是一个分号,也不是我忽略的那些简单错误之一。无论如何,我需要帮助,请查看我的代码。

function is_job_key(_jobkey, cb){ // cb(err, flag)
  var sql = 'SELECT * FROM tbl_indeed WHERE ?';
  conn.query(sql, {jobkey: _jobkey}, function(err, rows){
    if(err){
      console.log(err);
      return cb(true);
    }
    bar.tick();
    if(rows.length > 0){ // jobkey exists
      return cb(null, true);
    }
    cb(null, false);
  });
}
function insert_job(posts, cb){ // cb(err)
  var sql = 'INSERT INTO tbl_indeed SET ?';
  conn.query(sql, posts, function(err, result){
    if(err){
      console.log(err);
      return cb(true);
    }
    bar.tick();
    cb(null);
  });
}
function insert_all_jobs(job_arr, query_str, cb){ // cb(err, count_inserted)
  function get_posts(job){
    var posts = {jobkey: job.jobkey, snippet: job.snippet, url: job.url, jobtitle: job.jobtitle, company: job.company, date: job.date, query_string: query_str};
    return posts;
  }
  bar = new progress('  ' + query_str + ' (:current / :total) [:bar] :percent :etas', {
    complete: '=',
    incomplete: ' ',
    width: 40,
    total: job_arr.length*2
  });
  var count_inserted = 0;
  async.each(job_arr, function(job, cb){
    var posts = get_posts(job);
    is_job_key(job.jobkey, function(err, result){
      if(err) return cb(true);
      if(result){
        bar.tick();
        return cb(); // jobkey exists
      }
      insert_job(posts, function(err){
        if(err) return cb(true);
        count_inserted++;
        cb();
      });
    });
  }, function(err){
    if(err) return cb(true);
    console.log('done');
    conn.end();
    cb(null, count_inserted);
  });
}
var job_arr = JSON.parse(fs.readFileSync('technician.txt', 'utf-8'));
//job_arr = job_arr.splice(1, 10); //for some reason this works ok...
insert_all_jobs(job_arr, 'technician', function(err, result){
  if(err) return console.log('error');
  console.log(result);
});

感谢您阅读我的问题并度过了愉快的一天 〜A

0 个答案:

没有答案