Ankündigung

Einklappen
Keine Ankündigung bisher.

Unterstützung von MySQLdb

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Unterstützung von MySQLdb

    Hallo,

    ist eine Unterstützung von z.B. MySQL für die history geplant?
    Die Klasse heißt ja neutral SQL, wobei die items history auslaufen sollen ;-)
    PHP-Code:
            if 'sqlite' in item.conf or 'history' in item.conf:  # XXX legacy history option remove sometime 
    Gibt es in Python eine DB Abstraktion um nicht für jede DB ein neues Plugin schreiben zu müssen?

    Danke und Gruß

    JayKay

    #2
    Hallo Kay,

    Zitat von jaykay Beitrag anzeigen
    ist eine Unterstützung von z.B. MySQL für die history geplant?
    von mir momentan nicht. Wenn eine richtige DB, dann würde ich auf Postgres setzen.

    Zitat von jaykay Beitrag anzeigen
    Die Klasse heißt ja neutral SQL, wobei die items history auslaufen sollen ;-)
    Das kann man falsch verstehen. Die Item History bleibt erhalten. Das Attribut history soll rausfliegen und durch sqlite ersetzt werden.

    Zitat von jaykay Beitrag anzeigen
    Gibt es in Python eine DB Abstraktion um nicht für jede DB ein neues Plugin schreiben zu müssen?
    Ja, aber leider werden unterschiedliche SQL Statements von den DBs unterstützt, die müssten evtl. angepasst werden. Das könnte auch Auswirkungen auf die Methoden im Plugin haben.

    Bis bald

    Marcus

    Kommentar


      #3
      Hallo Marcus

      welchen Vorteil hat den Postgres gegenüber Mysql.
      Ich plane eigentlich Mysql mal zu integrieren.

      Grüße stromie

      Kommentar


        #4
        Hallo,

        Zitat von stromie Beitrag anzeigen
        welchen Vorteil hat den Postgres gegenüber Mysql.
        MySQL == Sun. Die haben die schlechte Patchpolitik von Sun aufgenommen.

        Ich hatte mir das vor längerer Zeit mal beide DB angesehen und bin zu dem Schluß gekommen das Postgres 'besser' ist. Welche Punkte mich zu dieser Aussage bewegt haben kann ich Dir leider nicht mehr sagen.
        Du kannst Dir ja selber ein Bild machen.

        Bis bald

        Marcus

        Kommentar


          #5
          Meine Beobachtung ist, das MySQL sehr gut unterstützt wird. Postgres währe meine 2te Wahl. Postgres hat einige Eigenarten die historisch bedingt sind und verwenden einen SQL-Dialekt der etwas ausgefallen ist.

          Gerade wenn es um einfache Selects / Inserts geht hat MySQL inzwischen die Nase ziemlich weit vorne (da auf einige Mechnismen verzichtet wird).

          Meine Empfehlung wäre: MySQL

          Gruss
          Join smartVISU on facebook. Web: smartvisu.de.
          Dir gefällt smartVISU? Bitte spenden für die Weiterentwicklung.

          Kommentar


            #6
            zur Zeit nutze ich MYSQL auf eine Windows Server.
            Mir währe auch lieber MYSQL auf den PI lauf zu lassen.

            Wie sieht es mit den Systemressourcen aus ?
            Ist da Postgres sparsamer ?

            Grüße Stromie

            Kommentar


              #7
              Hallo,

              Zitat von stromie Beitrag anzeigen
              Mir währe auch lieber MYSQL auf den PI lauf zu lassen.
              ich würde und habe auf dem Pi keine vollwertige Datenbank laufen lassen. Ich denke das der Ressourcenbedarf zu groß ist.
              Dazu müsste es aber mal testen und einen Performance-Vergleich aufstellen. Vllt hat Google ja schon eine Antwort darauf.

              Bzgl. Wahl MySQL oder PostgreSQL bin leidenschaftslos. Wer eine 'fette' Datenbank haben möchte schreibt das Plugin. Vllt kann man die gleichen SQL Statements bei MySQL und Postgres verwenden. Evtl. könnte man das ja auch später in ein DB-Plugin packen das im Endeffekt mit drei unterschiedlichen Engines läuft.

              Bis bald

              Marcus

              Kommentar


                #8
                Zitat von mknx Beitrag anzeigen
                Hallo,
                Ich denke das der Ressourcenbedarf zu groß ist.
                Ich glaub auch nicht, das der pi das packt, zumindest wird es "komische" effekte geben, wenn die Datenbank über Sekunden 100% Leistung zieht.

                Zitat von mknx Beitrag anzeigen
                ...Vllt kann man die gleichen SQL Statements bei MySQL und Postgres verwenden...
                Das geht leider nicht so einfach, da sind im Detail Unterschiede vorhanden. Man denke nur an die Darstellung eines Datumswertes.

                Gruss
                Join smartVISU on facebook. Web: smartvisu.de.
                Dir gefällt smartVISU? Bitte spenden für die Weiterentwicklung.

                Kommentar


                  #9
                  Hi,

                  ich habe schon einen MySQL Server u.a. um die Daten von linknx zuloggen ;-)
                  Denke wir müssen hier keine Grundsatzdiskussion anstossen, sondern pragmatische Lösungen finden... Ich fände es gut wen der User zwischen verschiedenen SQL Backends wählen kann. Ob das jetzt ein Plugin oder x verschiedene ist mir persönlich egal. Mit MySQL kenne ich mich aus, Python ist noch in der Lernphase, so das ich schlecht abschätzen kann ob Python einen eleganten Weg bietet verschieden DB zu verwenden....

                  Als erstes würde ich das History=true weiter bestehen lassen, da DB unabhängig ;-)

                  Ist das sqlite plugin staple, so das es als Referenz verwendet werden kann?

                  Gruß

                  JayKay

                  Kommentar


                    #10
                    Hi Kay,
                    Zitat von jaykay Beitrag anzeigen
                    Ist das sqlite plugin staple, so das es als Referenz verwendet werden kann?
                    ja es ist stable. (Bei mir wollte das Autokorrekt auch zuschlagen und staple schreiben)

                    Aber noch mal das Problem liegt nicht bei Python und die Anbindung der DB.
                    Die Differenzierung kommt durch die unterschiedlichen SQL Statements und dem Umgang mit den unterschiedlichen Rückgaben.

                    Bis bald

                    Marcus

                    Kommentar


                      #11
                      Hallo,

                      Aus verschiedenen Gründen hätte ich gerne meine Daten vom Raspberry auf einem externen MySQL Server und nicht in sqlite auf der SD.

                      Ich hab deshalb heute mal das sqlite plugin kopiert und zu einem mysql plugin umgeschrieben. War ne dicke Stunde Arbeit, also kein grösseres Problem (bis jetzt). Funktioniert soweit, muss natürlich noch ausführlich getestet werden.

                      Frage ist: Besteht Interesse das Plugin reifen zu lassen und als offizielles Plugin weiterzuführen ?

                      Wenn ja, müsste man sich mal überlegen ob man es nicht irgendwie hinkommt dass man ein generelles SQL plugin von der plugin.conf aus lädt und mit einem Parameter à la engine=mysql oder engine=sqlite irgend eine sub.py included die dann die db Aufrufe macht .... in den items.conf könnte man dann auch einfach sql=yes oder db=yes anstelle von sqlite=yes oder mysql=yes angeben ...

                      Natürlich nur falls vom Häuptling aus überhaupt offizielle Unterstützung von mehreren DB Engines gewünscht ist :-) Ich weiss ja dass die Zeit knapp ist ;-)

                      Serge

                      Kommentar


                        #12
                        Hallo Serge,

                        Ich wäre da sehr dran interessiert. Habe auch ein großen MySQL Server der gerne alles machen sollte ;-)

                        Gruß

                        JayKay

                        Kommentar


                          #13
                          Wenn du mal testen willst:
                          • Im smarthome/plugin Verzeichnis ein neues Unterverzeichnis mysql anlegen
                          • Die Datei aus folgendem Link da rein kopieren: https://github.com/Foxi352/smarthome.../plugins/mysql
                          • Den nötigen Python Mysql Connector installieren:
                            Code:
                            pip install --allow-external mysql-connector-python  mysql-connector-python
                          • Auf deinem MySQL Server eine Datenbank smarthome anlegen.
                          • Einen SQL Benutzer anlegen, z.B. mit der folgenden Kommandozeile:
                            Code:
                            GRANT ALL PRIVILEGES ON smarthome.* TO 'smarthome'@'localhost' IDENTIFIED BY 'smarthome';
                          • in smarthome/etc die Datei plugin.conf anpassen:
                            Code:
                            [sql]
                                class_name = SQL
                            #    class_path = plugins.sqlite
                                class_path = plugins.mysql
                            #    dbhost = localhost
                            #    dbname = smarthome
                            #    dbuser = smarthome
                            #    dbpass = smarthome
                            dbxxxx Parameter brauchst du nur anzugeben wenn sie von dem hier angegebenen Default abweichen.


                          Dann Smarthome neu starten und er müsste automatisch die Tabellen anlegen und anfangen zu befüllen. Momentan brauchst du in den Items nichts zu ändern, sprich es nutzt auch das sqlite = xx Parameter. Damit kann man sehr einfach zwischen sqlite und mysql hin und her schalten indem man einfach die eine Zeile in plugin.conf ändert. (class_path=xxxx)

                          Bis jetzt läuft es bei mir stabil und ich habe auch noch kein Problem festgestellt und noch keine Fehlermeldung erhalten.

                          MfG,

                          Serge

                          Kommentar


                            #14
                            Hallo Serge,

                            vielen Dank für das HoWTo ;-) Irgendwie klappt es bei mir nicht....

                            Zuerst scheint folgender Import noch zu fehlen:
                            Code:
                            from mysql.connector import errorcode
                            Das verhindert eine unschöne Fehlermeldung:
                            Code:
                            2014-03-27 19:26:15,255 ERROR    Main         Plugin sql exception: global name 'errorcode' is not defined -- plugin.py:__init__:57
                            Wenn ich dann im SQL Plugin den class_path auf mysql abändere und smarthome -d laufen lasse bekomme ich folgende Exception:
                            Code:
                            2014-03-27 19:29:45,046 ERROR    System       Logic: System, File: /usr/local/smarthome/logics/system.py, Line: 15, Method: <module>, Exception: 'Item' object has no attribute 'Load' -- scheduler.py:_task:334
                            Traceback (most recent call last):
                              File "/usr/local/smarthome/lib/scheduler.py", line 327, in _task
                                exec(obj.bytecode)
                              File "/usr/local/smarthome/logics/system.py", line 15, in <module>
                                sh.Messungen.System.Load(round(l5, 2))
                            AttributeError: 'Item' object has no attribute 'Load'
                            
                            
                            2014-03-27 19:29:52,025 ERROR    env_stat     Logic: env_stat, File: /usr/local/smarthome/lib/env/stat.py, Line: 13, Method: <module>, Exception: 'Item' object has no attribute 'threads' -- scheduler.py:_task:334
                            Traceback (most recent call last):
                              File "/usr/local/smarthome/lib/scheduler.py", line 327, in _task
                                exec(obj.bytecode)
                              File "/usr/local/smarthome/lib/env/stat.py", line 13, in <module>
                                sh.env.core.threads(threading.activeCount())
                            AttributeError: 'Item' object has no attribute 'threads'
                            Die Tabellen werden angelegt bleiben aber leer?

                            Code:
                                    [[[FlurKG]]]
                                        name = FlurKG [Lux]
                                        type = num
                                        visu = yes
                                        sqlite = yes
                                        rrd = yes
                                        sv_widget = "{{ plot.period('item', 'item', 'avg','24h') }}"
                                        knx_dpt = 9
                                        knx_listen = 0/1/0
                                        knx_init = 0/1/0
                            
                                    [[[Load]]]
                                        name = Load
                                        type = num
                                        visu = yes
                                        sqlite = yes
                                        rrd = yes
                                        sv_widget = "{{ plot.period('item', 'item', 'avg','24h') }}"
                            Auf der Konsole & im Logfile sehe ich nur folgende Infos zum (My)SQL Plugin:
                            Code:
                              cat smarthome.log | grep SQL
                            2014-03-27 20:37:01,183 DEBUG    Main         MySQL 5.5.35-0+wheezy1 -- __init__.py:__init__:84
                            2014-03-27 20:37:01,739 DEBUG    Main         MySQL Maintain next time: 2014-03-28 03:02:00+01:00 -- scheduler.py:_next_time:289
                            
                            cat smarthome.log | grep sql
                            2014-03-27 20:37:01,124 DEBUG    Main         Plugin: sql -- plugin.py:__init__:43
                            Fehlt mir noch was bei meinen items oder wo suche ich am besten weiter?

                            Danke und Gruß

                            JayKay

                            Kommentar


                              #15
                              Zitat von jaykay Beitrag anzeigen
                              Zuerst scheint folgender Import noch zu fehlen:
                              Code:
                              from mysql.connector import errorcode
                              Das finde ich komisch. Bei mir klappt das ohne das Import. Ich habe vor sh.py noch nicht mit Python gearbeitet daher wenig Erfahrung, aber ich dachte die Zeile
                              Code:
                              import mysql.connector as mysql
                              würde ALLES von mysql.connector einbinden...
                              Wie gesagt, bei mir klappt das ja anscheinend. Was hast du denn für ein OS ? Ich hab es auf einer Linux VM mit Ubuntu 13.10 laufen .... Hab noch nicht auf meinem rPi getestet, da ist die SD mal wieder abgeraucht (was der Grund meines Wechsels auf einen "richtigen" Rechner war).


                              Zitat von jaykay Beitrag anzeigen
                              Code:
                              AttributeError: 'Item' object has no attribute 'threads'
                              Die Tabellen werden angelegt bleiben aber leer?
                              Beides verstehe ich nicht, ich sehe nicht direkt was die Items und Threads Fehlermeldung aus der genannten .py Datei mit dem mysql plugin zu tun hat ... Deshalb kommen wahrscheinlich auch keine Werte in die DB...
                              Zitat von jaykay Beitrag anzeigen
                              Fehlt mir noch was bei meinen items oder wo suche ich am besten weiter?
                              Nein, an den Items muss bis jetzt noch nichts geschraubt werden, ich will es bis jetzt ja kompatibel halten damit man einfach hin- und herswitchen kann.

                              Wenn ich weiss auf welcher Platform du es laufen hast, welches OS u.s.w. dann versuche ich deine Probleme zu reproduzieren und im besten Fall zu beheben :-)

                              Serge

                              Kommentar

                              Lädt...
                              X