しかし私は同じMySQL
ユーザーアカウントで手動で実行SQL
自体が期待値を返した場合でもconsole
にnull
印刷され、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
からfunctions
とstored procedures
を削除防止MySQL
における問題を回避することですそれらは別々の声明として。それらを削除する解決策はfunctions
とstored 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 } ]
(にconsole.logを行いますwipeSQL)の前にconn.queryを実行して、どのクエリがビルドされてconn.queryに渡されているかを確認します。このクエリをmysqlクエリブラウザで手動で起動して結果を確認します。 – AJS
@AJSおそらく、 ( '%% DATABASE_NAME %% '、conf [' databasedatabase '])'を '.split(' %% DATABASE_NAME %% ')に置き換えていました。 ) 'おかげさまで、あなたがこの効果に対する回答を投稿した場合は、それを見つけてから受け入れます。 – CoryG
ようこそ...答えとして追加されました... – AJS