2017-04-03 14 views
0

しかし私は同じMySQLユーザーアカウントで手動で実行SQL自体が期待値を返した場合でもconsolenull印刷され、mysqlモジュールを介して、その下SQL実行次node.jsコードを有しています。適切な結果を取得するためにこれを実行していないことがありますか?結果を取得するnode.js multipleStatementsクエリから?

let wipeSQL = fs.readFileSync('./inc/sql/wipedb.sql', 'utf8').replace('%%DATABASE_NAME%%', conf['databasedatabase']); 
conn.query(wipeSQL, (err, results, fields) => { 
    if (err) { 
     conn.destroy(); 
     reject (false); 
     return; 
    } 
    console.log(results[results.length - 1][0]['@procedures'], fields[fields.length - 1]); 
    resolve(); 
}); 

USE `%%DATABASE_NAME%%`; 
SET FOREIGN_KEY_CHECKS = 0; 

SET @procedures = ''; 
SELECT 
    GROUP_CONCAT(CONCAT('DROP PROCEDURE IF EXISTS `', routine_schema, '`.`', routine_name, '`') SEPARATOR ';') 
INTO 
    @procedures 
FROM 
    information_schema.ROUTINES R 
WHERE 
    R.ROUTINE_TYPE = "PROCEDURE" AND 
    R.ROUTINE_SCHEMA = '%%DATABASE_NAME%%'; 

SET @procedures = CONCAT(@procedures, ';'); 

SET @functions = ''; 
SELECT 
    GROUP_CONCAT(CONCAT('DROP FUNCTION IF EXISTS `', routine_schema, '`.`', routine_name, '`') SEPARATOR ';') 
INTO 
    @functions 
FROM 
    information_schema.ROUTINES R 
WHERE 
    R.ROUTINE_TYPE = "FUNCTION" AND 
    R.ROUTINE_SCHEMA = '%%DATABASE_NAME%%'; 

SET @functions = CONCAT(@functions, ';'); 
SET @procedures = CONCAT(@procedures, @functions); 

SET @tables = ''; 
SELECT 
    GROUP_CONCAT(CONCAT('`', table_schema, '`.`', table_name, '`')) 
INTO 
    @tables 
FROM 
    information_schema.tables 
WHERE 
    table_schema = '%%DATABASE_NAME%%'; 

SET @tables = IF(@tables IS NULL, 'SET @tables = NULL;', CONCAT('DROP TABLE ', @tables, ';')); 

PREPARE stmt FROM @tables; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SET FOREIGN_KEY_CHECKS = 1; 

SELECT @procedures; 

目的は、私は物事がドロップさに戻り、次に実行することを必要とする、ダイナミックSQLから別内stored procedureからfunctionsstored proceduresを削除防止MySQLにおける問題を回避することですそれらは別々の声明として。それらを削除する解決策はfunctionsstored proceduresでもうまくいくが、私はそれが存在するとは期待していない(これはPHPのポートであり、複数のステートメントの戻り値がうまくいく)。

null [ FieldPacket { 
    catalog: 'def', 
    db: '', 
    table: '', 
    orgTable: '', 
    name: '@procedures', 
    orgName: '', 
    charsetNr: 33, 
    length: 50331645, 
    type: 250, 
    flags: 0, 
    decimals: 31, 
    default: undefined, 
    zeroFill: false, 
    protocol41: true } ] 
+1

(にconsole.logを行いますwipeSQL)の前にconn.queryを実行して、どのクエリがビルドされてconn.queryに渡されているかを確認します。このクエリをmysqlクエリブラウザで手動で起動して結果を確認します。 – AJS

+0

@AJSおそらく、 ( '%% DATABASE_NAME %% '、conf [' databasedatabase '])'を '.split(' %% DATABASE_NAME %% ')に置き換えていました。 ) 'おかげさまで、あなたがこの効果に対する回答を投稿した場合は、それを見つけてから受け入れます。 – CoryG

+0

ようこそ...答えとして追加されました... – AJS

答えて

1

はconn.query前にconsole.log(wipeSQL)を行うと、ビルドを取得し、結果を確認するためにMySQLのクエリブラウザ上で手動conn.query.Then火災にこのクエリを渡しているものを、クエリを確認してください。

関連する問題