如何使用mysql库在Node.js中创build存储过程?

如何使用mysql库在Node.js中创build存储过程? npm包mysql是否支持创build存储过程,还是在这段代码中有错误? 这是我使用的npm库: https : //www.npmjs.com/package/mysql

我正试图自动为一个开源项目设置数据库,以帮助新的贡献者获得他们的开发环境并使其运行(并让我们所有人都在相同的数据库模式中)。

为了做到这一点,我写了一个脚本,应该把所有的命令发送到一个mysql实例来设置数据库。 创build表正在工作,但是创build新的存储过程总是导致错误。 当我在MySQL Workbench中运行命令时,创build脚本确实有效,所以问题似乎仅限于脚本。

var emails = "CREATE TABLE emails (" + "`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY," + "`email` VARCHAR(2048) CHARACTER SET utf8" + ");"; var addEmail = "DELIMITER //\n" + "CREATE PROCEDURE addEmail(IN email VARCHAR(2048))\n" + "BEGIN\n" + "INSERT INTO emails (email) VALUES (email);\n" + "END //\n" + "DELIMITER ;"; var query = []; query.push(emails); query.push(addEmail); for(var i = 0; i < query.length; i++) { console.log(query[i]); connection.query(query[i], function (err, rows, fields) { if (!err) { console.log("success"); //emails succeeds, as do other create table commands } else { console.log('Error while performing Query.'); //any queries that create stored procedures fail } }); } 

从已被接受的答案中获得极好的build议,更正后的代码如下所示:

 var addEmail = "CREATE PROCEDURE addEmail(IN email VARCHAR(2048))\n" + "BEGIN\n" + "INSERT INTO emails (email) VALUES (email);\n" + "END"; 

  1. 当您以编程方式运行SQL时,不需要使用DELIMITER 。 仅当使用mysql客户端执行SQL语句stream时,才需要DELIMITER,无论是手动还是脚本文件。 当你一次运行一个查询时,你不必解决关于这个问题的任何含糊之处; 程序定义里面是声明的结尾。

  2. 从查询中检查错误状态是很好的,但是你也应该养成检查错误types和错误信息的习惯。 这将帮助您解决许多types的问题 – 无需发布到堆栈溢出,希望有人能及时回答您的问题!

     connection.query(query[i], function (err, rows, fields) { if (!err) { console.log("success"); } else { console.log('Error while performing Query.'); console.log(err.code); console.log(err.message); } });