NEWS
Vorh. Tabelle aus MySQL-Datenbank anbinden und auslesen
-
Ich habe eine vorhandene Tabelle in einer MYSQL Datenbank, welche ich gerne in Teilen via JS oder Blocky in Form von SQL Statements auslesen und weiterverarbeiten möchte.
Die vorhandenen IOBROKER STD- SQL Anbindung zum Datenloggen in die gleiche MY SQL Datenbank
soll davon unberührt bleiben.Leider enden alle hier im Forum gefunedenen Anfragen in dieser Richtung bei "Nutze die IO Broker dB."
Wenn ich die STD Implementierung für eine MySQL dB Connection als JS nutzen möchte
var mysql = require('mysql2'); //var mysql = require('mysql'); funktioniert auch nicht var con = mysql.createConnection({ host: "192.168.X.Y:3303", user: "USER", password: "PW" }); con.connect(function(err) { if (err) throw err; console.log("Connected!"); });
bekomme ich bereits verschiedene Fehlermeldungen.
Hier die Fehlermeldung mit mysql2:
sourceanalytix.0 (2200) Objects user redis pmessage */cfg.o.script.js.common.1_Running_Files.SQLdBCon:{"common":{"name":"SQLdBCon","expert":true,"engineType":"Javascript/js","engine":"system.adapter.javascript.0","source":"var mysql = require('mysql2');\r\n\r\nvar con = mysql.createConnection({\r\n host: "192.168.X.Y:3303",\r\n user: "USERDNAME",\r\n password: "PASSWORT"\r\n});\r\n\r\ncon.connect(function(err) {\r\n if (err) throw err;\r\n console.log("Connected!");\r\n});","debug":false,"verbose":false,"enabled":true},"type":"script","from":"system.adapter.admin.0","user":"system.user.admin","ts":1690141347794,"_id":"script.js.common.1_Running_Files.SQLdBCon","acl":{"object":1636,"owner":"system.user.admin","ownerGroup":"system.group.administrator"}}
Hier die Fehlermeldung mit mysql:
22:02:48.031 error javascript.0 (326872) script.js.common.1_Running_Files.SQLdBCon: Error: Cannot find module 'mysql'
22:02:48.033 error javascript.0 (326872) at script.js.common.1_Running_Files.SQLdBCon:1:13
22:02:48.034 error javascript.0 (326872) at script.js.common.1_Running_Files.SQLdBCon:13:3
22:02:48.038 error javascript.0 (326872) script.js.common.1_Running_Files.SQLdBCon: TypeError: Cannot read properties of undefined (reading 'createConnection')
22:02:48.038 error javascript.0 (326872) at script.js.common.1_Running_Files.SQLdBCon:3:17
22:02:48.039 error javascript.0 (326872) at script.js.common.1_Running_Files.SQLdBCon:13:3Habe zur Lösung versucht per npm install mysql das Problem zu beheben.
Mit scheint, ich hätte noch ein paar Options mit angeben müssen.
Kann hier jemand kurz auf die Sprünge helfen?Gruss
AtlantisUnion -
@atlantis Überlege Dir ob Du nicht lieber NodeRed nutzen willst, da gibts fertige Nodes.
-
@atlantis erstelle eine zweite Instanz des sql-adapters, trage dort deine DB ein und frage dann mit den iobroker Standard-Tools ab was immer du möchtest
sendTo("sql.1", "query", "select * from deine_db.deine_tabelle", (erg) => { log(erg) })
zu deinem urspr. Versuch:
const mysql = require('mysql2'); const con = mysql.createConnection({ host: "deine_ip", user: "user", password: "passwort" }); con.connect(function (err) { if (err) log(err); console.log("Connected!"); }); con.query("select * from deine_db.deine_tabelle", (err, erg, fld) => { log(erg) })
-
benutze einfach den Adapter. Mußt wohl darauf achten das der iobroker user auch auf die weitere DB zugreifen darf
result = await sendToAsync('sql.0', 'query', 'SELECT enum, name FROM iobroker.rooms WHERE enum = "' + r + '";') if (result.result[0] && result.result[0].length != 0) { if (result.result[0].name != room) { await sendToAsync('sql.0', 'query', 'UPDATE iobroker.rooms set name = "'+room+'" WHERE enum = "' + r + '";') } } else { await sendToAsync('sql.0', 'query', 'INSERT INTO iobroker.rooms (enum, name) VALUES ("' + r + '", "' + room + '");') }
-
@fastfoot
Habe die dB eingebunden, Verbindungsversuch erfolgt ohne Fehler.Habe dann mal versucht die Werte eine Teabelle zu lesen:
sendTo("sql.1", "query", "select * from FREISCHALTUNG", (erg) => { log(erg) })
Bekomme folgende Fehlermeldung in den Protokollen:
sourceanalytix.0 (2200) Objects user redis pmessage */cfg.o.script.js.common.1_Running_Files.SQLdBCon:{"common":{"name":"SQLdBCon","expert":true,"engineType":"Javascript/js","engine":"system.adapter.javascript.0","source":"sendTo(\"sql.1\", \"query\", \"select * from FREISCHALTUNG\", (erg) => {\r\n\r\n log(erg)\r\n\r\n})","debug":false,"verbose":false,"enabled":false},"type":"script","from":"system.adapter.admin.0","user":"system.user.admin","ts":1690230804235,"_id":"script.js.common.1_Running_Files.SQLdBCon","acl":{"object":1636,"owner":"system.user.admin","ownerGroup":"system.group.administrator"}}
Habe folgende Rechte eingestellt:
-
@atlantis was hat das mit sourceanalytics zu tun? wie sind deine Einstellungen für sql.1?
du kannst doch auch mein anderes Beispiel nutzen, wobei das hier auch funktioniert wenn du richtige settings nutzt
-
@fastfoot Was das mit sourceanalytics zu tun hat kann ich leider nicht sagen.
Immer wenn ich das JS ausführe aber auch wenn ich es stoppe mit dem Pausen Symbol kommt diese "Silly"-Meldung komlett so wie ich sie hier reincopiert habe.
Ich hätte erwartet dass dann im LOG das Ergebnis der Anfrage steht, oder?Der SQL Adapter läuft sonst so weit...
Settings wie folgt:
Was mich irritiert ist dass er eine Tabelle anlegen möchte???
-
@atlantis Hast du denn Sourceanalytics installiert? Wenn ja, mal stoppen für den test! Die Abfrage muss beim mysql die DB enthalten, wie in meinem Beispiel auch gezeigt. Dass er Tabellen erstellen will(und hoffentlich auch kann?) liegt daran dass der sql adapter glaubt dass er für iobroker da ist und da müssen dann natürlich auch die Tabellen da sein. Du wirst die aber nicht verwenden und auch nicht löschen! Der sql adapter wird hier für deine eigene Datenbank missbraucht
was ich so gar nicht verstehe ist dass du mein 2tes Beispiel ohne den SQL Adapter erst gar nicht probiert hast wo das doch dein ursprünglicher Ansatz war, der halt auch schon Fehler enthalten hatte