Ошибка в логе при запросе SQL

Сообщите об ошибках в ioBroker
Antworten
evgeny_nd
starter
Beiträge: 51
Registriert: 03.11.2016, 17:53

Ошибка в логе при запросе SQL

Beitrag von evgeny_nd » 29.11.2016, 11:39

Добрый день.
Есть настроенный и рабочий драйвер sql.0.
Пробую работать с данными из скрипта, для примера скопировал скрипт из описания SQL драйвера:

Code: Alles auswählen

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?

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

Re: Ошибка в логе при запросе SQL

Beitrag von spectrekr » 29.11.2016, 11:52

В запросе не выбрана база данных из которой идет выборка. Правильно будет:
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));
}
});

evgeny_nd
starter
Beiträge: 51
Registriert: 03.11.2016, 17:53

Re: Ошибка в логе при запросе SQL

Beitrag von evgeny_nd » 29.11.2016, 12:50

spectrekr hat geschrieben:В запросе не выбрана база данных из которой идет выборка. Правильно будет:
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) {...

А со вторым вариантом не подскажете что не так делаю?

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

Re: Ошибка в логе при запросе SQL

Beitrag von spectrekr » 29.11.2016, 12:58

sendTo полностью рабочий вариант, все свои скрипты переписал на данный вариант, раньше был с дополнительным пакетом mysql. Чтоб заработал второй вариант, надо в настройках драйвера javascript, в строке "Дополнительные NPM Модули" дописать mysql. Тогда он установит пакет, дальше в скрипте в начале инициализировать подключение:
Spoiler: Show hidden text

Code: Alles auswählen

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);
});
А потом уже использовать:
Spoiler: Show hidden text

Code: Alles auswählen

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);
    });

evgeny_nd
starter
Beiträge: 51
Registriert: 03.11.2016, 17:53

Re: Ошибка в логе при запросе SQL

Beitrag von evgeny_nd » 29.11.2016, 17:05

spectrekr hat geschrieben:sendTo полностью рабочий вариант, все свои скрипты переписал на данный вариант, раньше был с дополнительным пакетом mysql. Чтоб заработал второй вариант, надо в настройках драйвера javascript, в строке "Дополнительные NPM Модули" дописать mysql. Тогда он установит пакет, дальше в скрипте в начале инициализировать подключение:
Spoiler: Show hidden text

Code: Alles auswählen

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);
});
А потом уже использовать:
Spoiler: Show hidden text

Code: Alles auswählen

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, а может вы подскажете почему скрипт отрабатывает с ошибкой?

Code: Alles auswählen

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));
        }
    });
Лог:

Code: Alles auswählen

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, хотя массив заполнен верной суммой.

Benutzeravatar
Bluefox
Site Admin
Beiträge: 8110
Registriert: 13.07.2014, 14:42
Kontaktdaten:

Re: Ошибка в логе при запросе SQL

Beitrag von Bluefox » 29.11.2016, 18:12

evgeny_nd hat geschrieben:
spectrekr hat geschrieben:sendTo полностью рабочий вариант, все свои скрипты переписал на данный вариант, раньше был с дополнительным пакетом mysql. Чтоб заработал второй вариант, надо в настройках драйвера javascript, в строке "Дополнительные NPM Модули" дописать mysql. Тогда он установит пакет, дальше в скрипте в начале инициализировать подключение:
Spoiler: Show hidden text

Code: Alles auswählen

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);
});
А потом уже использовать:
Spoiler: Show hidden text

Code: Alles auswählen

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, а может вы подскажете почему скрипт отрабатывает с ошибкой?

Code: Alles auswählen

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));
        }
    });
Лог:

Code: Alles auswählen

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, хотя массив заполнен верной суммой.
Вот так должно работать.

Code: Alles auswählen

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));
        }
    });

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

Re: Ошибка в логе при запросе SQL

Beitrag von spectrekr » 29.11.2016, 18:18

evgeny_nd hat geschrieben:
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.
Я бы реализовал так:
Spoiler: Show hidden text

Code: Alles auswählen

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));
        }
    });

evgeny_nd
starter
Beiträge: 51
Registriert: 03.11.2016, 17:53

Re: Ошибка в логе при запросе SQL

Beitrag von evgeny_nd » 30.11.2016, 06:31

Bluefox hat geschrieben:
evgeny_nd hat geschrieben:
spectrekr hat geschrieben:sendTo полностью рабочий вариант, все свои скрипты переписал на данный вариант, раньше был с дополнительным пакетом mysql. Чтоб заработал второй вариант, надо в настройках драйвера javascript, в строке "Дополнительные NPM Модули" дописать mysql. Тогда он установит пакет, дальше в скрипте в начале инициализировать подключение:
Spoiler: Show hidden text

Code: Alles auswählen

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);
});
А потом уже использовать:
Spoiler: Show hidden text

Code: Alles auswählen

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, а может вы подскажете почему скрипт отрабатывает с ошибкой?

Code: Alles auswählen

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));
        }
    });
Лог:

Code: Alles auswählen

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, хотя массив заполнен верной суммой.
Вот так должно работать.

Code: Alles auswählen

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)

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

Re: Ошибка в логе при запросе SQL

Beitrag von spectrekr » 30.11.2016, 08:29

А по моему примеру пробовали?

Benutzeravatar
Bluefox
Site Admin
Beiträge: 8110
Registriert: 13.07.2014, 14:42
Kontaktdaten:

Re: Ошибка в логе при запросе SQL

Beitrag von Bluefox » 30.11.2016, 11:29

Code: Alles auswählen

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));
        }
    });

evgeny_nd
starter
Beiträge: 51
Registriert: 03.11.2016, 17:53

Re: Ошибка в логе при запросе SQL

Beitrag von evgeny_nd » 30.11.2016, 12:02

spectrekr hat geschrieben:А по моему примеру пробовали?
По вашему примеру нет, т.к. вы в коде указали значение столбца sum, а я суммирую значение столбца val - SUM(val).
Поэтому я думаю дело как раз в том что из-за скобок JSON и не обрабатывает.

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

Re: Ошибка в логе при запросе SQL

Beitrag von spectrekr » 30.11.2016, 12:05

evgeny_nd hat geschrieben:
spectrekr hat geschrieben:А по моему примеру пробовали?
По вашему примеру нет, т.к. вы в коде указали значение столбца sum, а я суммирую значение столбца val - SUM(val).
Поэтому я думаю дело как раз в том что из-за скобок JSON и не обрабатывает.
Ну тогда так:
Spoiler: Show hidden text

Code: Alles auswählen

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));
        }
    });

evgeny_nd
starter
Beiträge: 51
Registriert: 03.11.2016, 17:53

Re: Ошибка в логе при запросе SQL

Beitrag von evgeny_nd » 30.11.2016, 12:06

Bluefox hat geschrieben:

Code: Alles auswählen

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}]

Может все-таки дело в скобках, которые стоят в строке-результате?
Можно конечно из полученного результата получить нужное значение цифры, путем нескольких преобразований строки, но это же не правильно.

evgeny_nd
starter
Beiträge: 51
Registriert: 03.11.2016, 17:53

Re: Ошибка в логе при запросе SQL

Beitrag von evgeny_nd » 30.11.2016, 12:11

spectrekr hat geschrieben:
evgeny_nd hat geschrieben:
spectrekr hat geschrieben:А по моему примеру пробовали?
По вашему примеру нет, т.к. вы в коде указали значение столбца sum, а я суммирую значение столбца val - SUM(val).
Поэтому я думаю дело как раз в том что из-за скобок JSON и не обрабатывает.
Ну тогда так:
Spoiler: Show hidden text

Code: Alles auswählen

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 запросом, а то мне кажется он нереальную цифру выдает часового потребления электричества, но это уже другое.
Спасибо большое.

Antworten