NEWS
Ошибка в логе при запросе SQL
-
Добрый день.
Есть настроенный и рабочий драйвер sql.0.
Пробую работать с данными из скрипта, для примера скопировал скрипт из описания SQL драйвера:
sendTo('sql.0', 'query', 'SELECT * FROM datapoints', function (result) { if (result.error) { console.error(result.error); } else { // show result console.log('Rows: ' + JSON.stringify(result.result)); } });
Однако выходит ошибка в логе при его выполнении:
script.js.common.Примеры.SQL: Error: ER_NO_DB_ERROR: No database selected
По форуму поискал, таких ошибок не нашел, по описанию работы с SQL, тоже нашел примеры только через "var connection = mysql.createConnection()…"
Попробовал пример через него, вышла другая ошибка:
javascript.0 2016-11-29 17:47:55.408 error script.js.common.Примеры.SQL: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/node_modules/mysql'
Рабочий ли вариант с sendTo? Если да, то что еще нужно добавлять в скрипт перед ним?
Если нужно работать по второму варианту, то как правильно установить модуль, на который ссылается Log?
-
В запросе не выбрана база данных из которой идет выборка. Правильно будет:
sendTo('sql.0', 'query', 'SELECT * FROM datapoints.название базы', function (result) {
if (result.error) {
console.error(result.error);
} else {
// show result
console.log('Rows: ' + JSON.stringify(result.result));
}
});
-
В запросе не выбрана база данных из которой идет выборка. Правильно будет:
sendTo('sql.0', 'query', 'SELECT * FROM datapoints.название базы', function (result) {
if (result.error) {
console.error(result.error);
} else {
// show result
console.log('Rows: ' + JSON.stringify(result.result));
}
}); `
Спасибо :), этот вариант заработал, но только с такой конструкцией:
sendTo('sql.0', 'query', 'SELECT * FROM название базы.datapoints', function (result) {…
А со вторым вариантом не подскажете что не так делаю?
-
sendTo полностью рабочий вариант, все свои скрипты переписал на данный вариант, раньше был с дополнительным пакетом mysql. Чтоб заработал второй вариант, надо в настройках драйвера javascript, в строке "Дополнительные NPM Модули" дописать mysql. Тогда он установит пакет, дальше в скрипте в начале инициализировать подключение:
!
var mysql = require('mysql'); ! var connection = mysql.createConnection({ host: 'localhost', user: 'user_name', password: 'password', database: 'database_name', socketPath: '/var/run/mysqld/mysqld.sock' }); ! connection.connect(function(err) { if (err) { log('error connecting: ' + err.stack); return; } ! log('connected as id ' + connection.threadId); }); !
А потом уже использовать:!
connection.query('SELECT max(id) AS id FROM inbox', function(err, res_id, fields) { if (err) throw err; setState('sms.in.id', res_id[0].id); }); !
-
sendTo полностью рабочий вариант, все свои скрипты переписал на данный вариант, раньше был с дополнительным пакетом mysql. Чтоб заработал второй вариант, надо в настройках драйвера javascript, в строке "Дополнительные NPM Модули" дописать mysql. Тогда он установит пакет, дальше в скрипте в начале инициализировать подключение:
!
var mysql = require('mysql'); ! var connection = mysql.createConnection({ host: 'localhost', user: 'user_name', password: 'password', database: 'database_name', socketPath: '/var/run/mysqld/mysqld.sock' }); ! connection.connect(function(err) { if (err) { log('error connecting: ' + err.stack); return; } ! log('connected as id ' + connection.threadId); }); !
А потом уже использовать:!
connection.query('SELECT max(id) AS id FROM inbox', function(err, res_id, fields) { if (err) throw err; setState('sms.in.id', res_id[0].id); }); !
`Professional, а может вы подскажете почему скрипт отрабатывает с ошибкой?
sendTo('sql.0', 'query', 'SELECT SUM(val) FROM iobroker.ts_number WHERE FROM_UNIXTIME(ts/1000) >= CURDATE() AND id=27', function (result) { if (result.error) { console.error(result.error); } else { log ('RES: ' + result.result[0].val); console.log('Rows1: ' + JSON.stringify(result.result)); } });
Лог:
23:02:27.439 [info] javascript.0 script.js.common.Примеры.SQL: RES: undefined 23:02:27.439 [info] javascript.0 script.js.common.Примеры.SQL: Rows1: [{"SUM(val)":1047.4444444444448}]
Я дальше хочу значение суммы передать в переменную, созданную вручную. А ее значение почему-то выдает undefined, хотя массив заполнен верной суммой.
-
sendTo полностью рабочий вариант, все свои скрипты переписал на данный вариант, раньше был с дополнительным пакетом mysql. Чтоб заработал второй вариант, надо в настройках драйвера javascript, в строке "Дополнительные NPM Модули" дописать mysql. Тогда он установит пакет, дальше в скрипте в начале инициализировать подключение:
!
var mysql = require('mysql'); ! var connection = mysql.createConnection({ host: 'localhost', user: 'user_name', password: 'password', database: 'database_name', socketPath: '/var/run/mysqld/mysqld.sock' }); ! connection.connect(function(err) { if (err) { log('error connecting: ' + err.stack); return; } ! log('connected as id ' + connection.threadId); }); !
А потом уже использовать:!
connection.query('SELECT max(id) AS id FROM inbox', function(err, res_id, fields) { if (err) throw err; setState('sms.in.id', res_id[0].id); }); !
`Professional, а может вы подскажете почему скрипт отрабатывает с ошибкой?
sendTo('sql.0', 'query', 'SELECT SUM(val) FROM iobroker.ts_number WHERE FROM_UNIXTIME(ts/1000) >= CURDATE() AND id=27', function (result) { if (result.error) { console.error(result.error); } else { log ('RES: ' + result.result[0].val); console.log('Rows1: ' + JSON.stringify(result.result)); } });
Лог:
23:02:27.439 [info] javascript.0 script.js.common.Примеры.SQL: RES: undefined 23:02:27.439 [info] javascript.0 script.js.common.Примеры.SQL: Rows1: [{"SUM(val)":1047.4444444444448}]
Я дальше хочу значение суммы передать в переменную, созданную вручную. А ее значение почему-то выдает undefined, хотя массив заполнен верной суммой. `
Вот так должно работать.sendTo('sql.0', 'query', 'SELECT SUM(val) FROM iobroker.ts_number WHERE FROM_UNIXTIME(ts/1000) >= CURDATE() AND id=27', function (result) { if (result.error) { console.error(result.error); } else { log ('RES: ' + result.result["SUM(val)"].val); console.log('Rows1: ' + JSON.stringify(result.result)); } });
-
Professional, а может вы подскажете почему скрипт отрабатывает с ошибкой?
sendTo('sql.0', 'query', 'SELECT SUM(val) FROM iobroker.ts_number WHERE FROM_UNIXTIME(ts/1000) >= CURDATE() AND id=27', function (result) {
if (result.error) {
console.error(result.error);
} else {
log ('RES: ' + result.result[0].val);
console.log('Rows1: ' + JSON.stringify(result.result));
}
});
Лог:
23:02:27.439 [info] javascript.0 script.js.common.Примеры.SQL: RES: undefined
23:02:27.439 [info] javascript.0 script.js.common.Примеры.SQL: Rows1: [{"SUM(val)":1047.4444444444448}]
Я дальше хочу значение суммы передать в переменную, созданную вручную. А ее значение почему-то выдает undefined, хотя массив заполнен верной суммой. `
Так, если у вас result.result[0].val вещественное число, то попробуйте parseFloat(result.result[0].val). Это если вдруг вам потом надо будет работать как с числом, если просто как значение, то тоже через JSON.stringify.
Я бы реализовал так:
!
sendTo('sql.0', 'query', 'SELECT sum FROM iobroker.ts_number WHERE FROM_UNIXTIME(ts/1000) >= CURDATE() AND id=27', function (result) { if (result.error) { console.error(result.error); } else { log ('RES: ' + JSON.stringify(result.result[0].sum)); setState('sum', parseFloat(result.result[0].sum)); } }); !
-
sendTo полностью рабочий вариант, все свои скрипты переписал на данный вариант, раньше был с дополнительным пакетом mysql. Чтоб заработал второй вариант, надо в настройках драйвера javascript, в строке "Дополнительные NPM Модули" дописать mysql. Тогда он установит пакет, дальше в скрипте в начале инициализировать подключение:
!
var mysql = require('mysql'); ! var connection = mysql.createConnection({ host: 'localhost', user: 'user_name', password: 'password', database: 'database_name', socketPath: '/var/run/mysqld/mysqld.sock' }); ! connection.connect(function(err) { if (err) { log('error connecting: ' + err.stack); return; } ! log('connected as id ' + connection.threadId); }); !
А потом уже использовать:!
connection.query('SELECT max(id) AS id FROM inbox', function(err, res_id, fields) { if (err) throw err; setState('sms.in.id', res_id[0].id); }); !
`Professional, а может вы подскажете почему скрипт отрабатывает с ошибкой?
sendTo('sql.0', 'query', 'SELECT SUM(val) FROM iobroker.ts_number WHERE FROM_UNIXTIME(ts/1000) >= CURDATE() AND id=27', function (result) { if (result.error) { console.error(result.error); } else { log ('RES: ' + result.result[0].val); console.log('Rows1: ' + JSON.stringify(result.result)); } });
Лог:
23:02:27.439 [info] javascript.0 script.js.common.Примеры.SQL: RES: undefined 23:02:27.439 [info] javascript.0 script.js.common.Примеры.SQL: Rows1: [{"SUM(val)":1047.4444444444448}]
Я дальше хочу значение суммы передать в переменную, созданную вручную. А ее значение почему-то выдает undefined, хотя массив заполнен верной суммой. `
Вот так должно работать.sendTo('sql.0', 'query', 'SELECT SUM(val) FROM iobroker.ts_number WHERE FROM_UNIXTIME(ts/1000) >= CURDATE() AND id=27', function (result) { if (result.error) { console.error(result.error); } else { log ('RES: ' + result.result["SUM(val)"].val); console.log('Rows1: ' + JSON.stringify(result.result)); } }); ```` `
BlueFox,
Ругается на строчку:
TypeError: Cannot read property 'val' of undefined at Object.cb (script.js.common.Примеры.SQL:42:52) at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:2155:71) at Socket. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30) at Socket.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:131:20) at Socket.onevent (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:270:10) at Socket.onpacket (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:228:12) at Manager. (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15) at Manager.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:131:20) at Manager.ondecoded (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/manager.js:332:8) at Decoder. (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
-
А по моему примеру пробовали?
-
sendTo('sql.0', 'query', 'SELECT SUM(val) FROM iobroker.ts_number WHERE FROM_UNIXTIME(ts/1000) >= CURDATE() AND id=27', function (result) { if (result.error) { console.error(result.error); } else { log ('RES: ' + result.result["SUM(val)"]); console.log('Rows1: ' + JSON.stringify(result.result)); } });
-
А по моему примеру пробовали? `
По вашему примеру нет, т.к. вы в коде указали значение столбца sum, а я суммирую значение столбца val - SUM(val).
Поэтому я думаю дело как раз в том что из-за скобок JSON и не обрабатывает.
-
А по моему примеру пробовали? `
По вашему примеру нет, т.к. вы в коде указали значение столбца sum, а я суммирую значение столбца val - SUM(val).
Поэтому я думаю дело как раз в том что из-за скобок JSON и не обрабатывает. `
Ну тогда так:
! ````
sendTo('sql.0', 'query', 'SELECT SUM(val) as sum FROM iobroker.ts_number WHERE FROM_UNIXTIME(ts/1000) >= CURDATE() AND id=27', function (result) {
if (result.error) {
console.error(result.error);
} else {
log ('RES: ' + JSON.stringify(result.result[0].sum));
setState('sum', parseFloat(result.result[0].sum));
}
}); -
sendTo('sql.0', 'query', 'SELECT SUM(val) FROM iobroker.ts_number WHERE FROM_UNIXTIME(ts/1000) >= CURDATE() AND id=27', function (result) { if (result.error) { console.error(result.error); } else { log ('RES: ' + result.result["SUM(val)"]); console.log('Rows1: ' + JSON.stringify(result.result)); } }); ```` `
Так я уже пробовал :).
Выдает
18:06:23.080 [info] javascript.0 script.js.common.Примеры.SQL: RES: undefined
18:06:23.080 [info] javascript.0 script.js.common.Примеры.SQL: Rows1: [{"SUM(val)":7776.364444444442}]
Может все-таки дело в скобках, которые стоят в строке-результате?
Можно конечно из полученного результата получить нужное значение цифры, путем нескольких преобразований строки, но это же не правильно.
-
А по моему примеру пробовали? `
По вашему примеру нет, т.к. вы в коде указали значение столбца sum, а я суммирую значение столбца val - SUM(val).
Поэтому я думаю дело как раз в том что из-за скобок JSON и не обрабатывает. `
Ну тогда так:
!
sendTo('sql.0', 'query', 'SELECT SUM(val) as sum FROM iobroker.ts_number WHERE FROM_UNIXTIME(ts/1000) >= CURDATE() AND id=27', function (result) { if (result.error) { console.error(result.error); } else { log ('RES: ' + JSON.stringify(result.result[0].sum)); setState('sum', parseFloat(result.result[0].sum)); } });
`Да!
Так заработало. Осталось только теперь разобраться с сами SQL запросом, а то мне кажется он нереальную цифру выдает часового потребления электричества, но это уже другое.
Спасибо большое.