Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. Ошибка
    5. ioBroker ошибки
    6. Ошибка в логе при запросе SQL

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

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

    This topic has been deleted. Only users with topic management privileges can see it.
    • E
      evgeny_nd last edited by

      Добрый день.

      Есть настроенный и рабочий драйвер 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?

      1 Reply Last reply Reply Quote 0
      • S
        spectrekr last edited by

        В запросе не выбрана база данных из которой идет выборка. Правильно будет:

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

        }

        });

        1 Reply Last reply Reply Quote 0
        • E
          evgeny_nd last edited by

          @spectrekr:

          В запросе не выбрана база данных из которой идет выборка. Правильно будет:

          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) {…

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

          1 Reply Last reply Reply Quote 0
          • S
            spectrekr last edited by

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

            1 Reply Last reply Reply Quote 0
            • E
              evgeny_nd last edited by

              @spectrekr:

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

              1 Reply Last reply Reply Quote 0
              • Bluefox
                Bluefox last edited by

                @evgeny_nd:

                @spectrekr:

                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));
                        }
                    });
                
                1 Reply Last reply Reply Quote 0
                • S
                  spectrekr last edited by

                  @evgeny_nd:

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

                  1 Reply Last reply Reply Quote 0
                  • E
                    evgeny_nd last edited by

                    @Bluefox:

                    @evgeny_nd:

                    @spectrekr:

                    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)

                    1 Reply Last reply Reply Quote 0
                    • S
                      spectrekr last edited by

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

                      1 Reply Last reply Reply Quote 0
                      • Bluefox
                        Bluefox last edited by

                        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));
                                }
                            });
                        
                        1 Reply Last reply Reply Quote 0
                        • E
                          evgeny_nd last edited by

                          @spectrekr:

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

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

                          Поэтому я думаю дело как раз в том что из-за скобок JSON и не обрабатывает.

                          1 Reply Last reply Reply Quote 0
                          • S
                            spectrekr last edited by

                            @evgeny_nd:

                            @spectrekr:

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

                            По вашему примеру нет, т.к. вы в коде указали значение столбца 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));
                            }
                            });

                            1 Reply Last reply Reply Quote 0
                            • E
                              evgeny_nd last edited by

                              @Bluefox:

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

                              Может все-таки дело в скобках, которые стоят в строке-результате?

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

                              1 Reply Last reply Reply Quote 0
                              • E
                                evgeny_nd last edited by

                                @spectrekr:

                                @evgeny_nd:

                                @spectrekr:

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

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

                                Спасибо большое.

                                1 Reply Last reply Reply Quote 0
                                • First post
                                  Last post

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                684
                                Online

                                31.8k
                                Users

                                80.0k
                                Topics

                                1.3m
                                Posts

                                3
                                14
                                8067
                                Loading More Posts
                                • Oldest to Newest
                                • Newest to Oldest
                                • Most Votes
                                Reply
                                • Reply as topic
                                Log in to reply
                                Community
                                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                The ioBroker Community 2014-2023
                                logo