【问题标题】:Unable to get insertId of the last INSERT in MySQL with NodeJS无法使用 NodeJS 获取 MySQL 中最后一个 INSERT 的 insertId
【发布时间】:2021-09-17 06:42:41
【问题描述】:

我正在使用带有异步和等待的 NodeJS 的 MySQL。我正在尝试从插入的行中获取最后一个 insertid,但不断出现错误。

这里是异步函数;

function makeDb( config ) {
  const connection = mysql.createConnection( config );  return {
    query( sql, args ) {
      return util.promisify( connection.query )
        .call( connection, sql, args );
    },
    close() {
      return util.promisify( connection.end ).call( connection );
    }
  };
}

这是查询失败的代码;

try {       
    if(tag1){

            row_b = await db.query( "SELECT tagid FROM tags WHERE tagname = ?", [tag1]);    
            const onetagid1 = row_b[0].tagid;               
                console.log('onetagid1 = ' + onetagid1);    
       
    if (row_b > 0){         
            row_c = await db.query("
                INSERT INTO entitytag (tagid1, audioid) VALUES (?,?) 
                ON DUPLICATE KEY UPDATE tagid1 = ?" [onetagid1, audioid, onetagid1]
            );              
    } else {    
            row_d = await db.query( 'INSERT IGNORE INTO tags (tagname) VALUES (?)', [tag1]);            
                var twotagid1 = row_d.insertId;             
                    console.log('twotagid1 2nd = ' + twotagid1); 
        
            row_e = await db.query(
                "INSERT INTO entitytag (tagid1, audioid) VALUES (?,?) 
                ON DUPLICATE KEY UPDATE tagid1 = ?" [twotagid1, audioid, twotagid1]
            );                  
    }  
        res.json('json success!');  
    }                   
}

这是错误;

onetagid1 = 30
twotagid1 2nd = 0
ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'I' at line 1

错误是twotagid1 2nd = 0,不应为零。

【问题讨论】:

  • 良好的代码缩进将帮助我们阅读代码,更重要的是它会帮助您调试代码Take a quick look at a coding standard 为您自己的利益。您可能会被要求在几周/几个月内修改此代码,最后您会感谢我的。
  • 哪个行号出现错误,有 2 个 INSERTS
  • tags 表是否有定义为 AUTO-INCREMENT 的列??
  • There are many packages 允许您将 MySQL 与 NodeJS 一起使用。您在项目中具体使用了哪些包(通过代码库中的require())。如果您使用的是最流行的包mysqljs/mysql,它不支持您在示例中使用的asyncawait。但是,其他一些软件包可以。请提供其他人需要帮助您的所有必要详细信息。
  • 现在您已经确认您正在使用mysqljs/mysql 包 - 我们可以自信地说它不包括对asyncawait 的本机支持。因此,如果您提供的代码示例“有时在其他页面上工作”,那么您必须尝试通过您自己制作的模块或类来扩展或修改包,以便它支持async。是这样吗?如果是这样,您还需要分享这些详细信息,因为这可能是您的问题所在。在您精通包的核心特性和功能之前,您应该避免使抽象问题变得复杂。

标签: mysql node.js async-await sql-insert node-mysql


【解决方案1】:

我不确定为什么在另一个没有的情况下它会起作用。但是我会在这里发布,希望有人能够发现它;

try {

    if(tag1){   
    
        row_c = await db.query( "SELECT tagid FROM tags WHERE tagname = ?", [tag1]);    
    
    if (row_c.length > 0){  
        console.log('tag exists in database ');
            const tagid1 = row_c[0].tagid;
               console.log('tagid1 = ' + tagid1);

    row_f = await db.query(
           "INSERT INTO entitytag (tagid1, audioid) VALUES (?,?) 
               ON DUPLICATE KEY UPDATE tagid1 = ?", [tagid1, audioid, tagid1 ]);
    } else {
        console.log('tag does not exist in database ');
    
    row_d = await db.query( 'INSERT IGNORE INTO tags (tagname) VALUES (?)', [tag1]);    
        const tagInsertId = row_d.insertId; 
            console.log('tagInsertId = ' + tagInsertId);

    row_e = db.query(
        'INSERT INTO entitytag (tagid1, audioid) VALUES (?,?) 
             ON DUPLICATE KEY UPDATE tagid1 = ?', [tagInsertId, audioid, tagInsertId ]);
    }   
    }
         console.log('success!');
             res.json(tag1);    
    } 

【讨论】:

    猜你喜欢
    • 2021-09-12
    • 1970-01-01
    • 2014-01-31
    • 2017-07-17
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    相关资源
    最近更新 更多