Seite 1 von 1

Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 17:33
von kiaralle
Hallo,
ich möchte meinen Code umbrechen damit er besser lesbar ist.
Komme aber nicht so zum Ziel. Wird der Feler durch meine Formatierung erzeugt, oder liegt wirklich ein Fehler im SQL vor.

Wenn ich den Code teste bekomme ich hier immer einen Fehler.
Master - Error adding entry to database: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"INSERT INTO master(
status , vpv1 , vpv2 , p...' at line 1

Code: Alles auswählen

                
                statement = '''"INSERT INTO master(
                status , vpv1 , vpv2 , ppv1h , ppv1l ,
                buck1curr , buck2curr , op_watth , op_wattl , op_vah ,
                op_val , acchr_wtth , acchr_wattl , acchr_vah , acchr_val ,
                bat_volt , batterysoc , busvolt , gridvolt , linefreq ,
                outputvolt , outputfreq , outputdcv , invtemp , dcdctemp ,
                loadpercent , bat_s_volt , bat_dspb_v ,timetotalh , timetotall ,
                buck1temp , buck2temp , op_curr ,inv_curr , ac_inwatth ,
                ac_inwattl , ac_invah ,ac_inval , faultbit , warnbit ,
                faultvalue ,warnvalue , dtc , checkstep , productionlm ,
                constpokf , epv1_todayh , epv1_todayl , epv1_totalh , epv1_totall ,
                eac_chrtodayh , eac_chrtodayl , eac_chrtotalh , eac_chrtotall , ebat_chrtodayh ,
                ebat_chrtodayl , ebat_chrtotalh , ebat_chrtotall , eac_dischrtodayh , eac_dischrtodayl ,
                eac_dischrtotalh , eac_dischrtotall , acchrcurr , ac_dischrwatth , ac_dischrwattl ,
                ac_dischrvah , ac_dischrval , bat_dischrwatth , bat_dischrwattl , bat_dischrvah ,
                bat_dischrval , bat_watth , bat_wattl , uwslavexxistcnt , batovercharge ,
                mpptfanspeed , invfanspeed , totalchgcur , eop_dischrtoday_h , eop_dischrtoday_l ,
                eop_dischrtotal_h , eop_dischrtotal_l
                ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s)"'''

Danke für die Hilfe, Gruß Ralf

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 17:51
von Sirius3
Was sollen denn die doppelten Anführungszeichen?

Was Du dringend anpassen solltest, sind die Namen Deiner Felder. Niemand kann das entschlüsseln. Was soll denn ppv1h sein und warum gibt es ein ppv1l?
82 Felder für eine Tabelle sind auch ein bißchen viel.

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 17:59
von kiaralle
Was soll denn ppv1h sein und warum gibt es ein ppv1l
Das passt schon. Es sind die Bezeichnungen der Register laut Modbustabelle. ppv1 = Power-PV-1... High und Low.

Mit den """ geht es auch nicht.

Die 82 Felder hab ich aktuell in mehrere Tabellen zerlegt. funktioniert.
Dachte ich teste mal mit 82 und schaue ob er schneller wird, statt mit 8 Tabellen.
So groß wird die Tabelle nicht, ich lösche was älter als 12h ist.

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 18:02
von kiaralle

Code: Alles auswählen

statement = """
                "INSERT INTO master(
                status , vpv1 , vpv2 , ppv1h , ppv1l ,
                buck1curr , buck2c
                ....
                
So wird es besser :-)

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 18:07
von kiaralle
Zu früh gefreut.

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 18:09
von __blackjack__
Die " um das Statement, die ja Bestandteil des *Inhalts* der Zeichenkette sind, sind halt falsch.

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 18:17
von kiaralle
Der Fehler liegt wahrscheinlich weiter unten.

Kann data aus master_result.registers[0] unten so beliefert werden?
master_result.registers[0] ist doch jetzt ein String und kein Wert...
So mal als Anfänger gedacht :-)
Bitte mal nicht an die vielen master_result.registers[0] stören. Das wird abgeändert. Aktuell ist der Wert für dieses Register aus dem Wechselrichter 12.

Code: Alles auswählen

cursor.execute(statement, data)

Code: Alles auswählen

                cursor = connection.cursor()
                statement = """
                "INSERT INTO master(
                status , vpv1 , vpv2 , ppv1h , ppv1l ,
                buck1curr , buck2curr , op_watth , op_wattl , op_vah ,
                op_val , acchr_wtth , acchr_wattl , acchr_vah , acchr_val ,
                bat_volt , batterysoc , busvolt , gridvolt , linefreq ,
                outputvolt , outputfreq , outputdcv , invtemp , dcdctemp ,
                loadpercent , bat_s_volt , bat_dspb_v , timetotalh , timetotall ,
                buck1temp , buck2temp , op_curr ,inv_curr , ac_inwatth ,
                ac_inwattl , ac_invah ,ac_inval , faultbit , warnbit ,
                faultvalue , warnvalue , dtc , checkstep , productionlm ,
                constpokf , epv1_todayh , epv1_todayl , epv1_totalh , epv1_totall ,
                eac_chrtodayh , eac_chrtodayl , eac_chrtotalh , eac_chrtotall , ebat_chrtodayh ,
                ebat_chrtodayl , ebat_chrtotalh , ebat_chrtotall , eac_dischrtodayh , eac_dischrtodayl ,
                eac_dischrtotalh , eac_dischrtotall , acchrcurr , ac_dischrwatth , ac_dischrwattl ,
                ac_dischrvah , ac_dischrval , bat_dischrwatth , bat_dischrwattl , bat_dischrvah ,
                bat_dischrval , bat_watth , bat_wattl , uwslavexxistcnt , batovercharge ,
                mpptfanspeed , invfanspeed , totalchgcur , eop_dischrtoday_h , eop_dischrtoday_l ,
                eop_dischrtotal_h , eop_dischrtotal_l
                ) VALUES (
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
                %s, %s)"
                """

                data = """
                (master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0],master_result.registers[0], master_result.registers[0],master_result.registers[0],
                master_result.registers[0], master_result.registers[0])
                """
                cursor.execute(statement, data)
                connection.commit()

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 18:47
von sparrow
Ich denke, du missverstehst, wae die """ tun. Die leiten eine Zeichenkette ein. Die _kann_ mehrzeilig sein. Muss aber nicht.

Code: Alles auswählen

>>> """abc""" == "abc"
True
Das ist also nichts, was allgemine benutzt wird, demit etwas nicht umgebrochen wird.
Bei data mach das also schon einmal gar keinen Sinn. Das ist jetzt eine lange Zeichenkette statt ein Tuple.
Der Interpreter ist aber so schlau zu wissen, dass ein Tuple er mit einer schließenden Klammer endet. Du kannst nach den einzelnen Elementen umbrechen.

Und das selbe Verständnisproblem hast du auch bei dem Select-Statement. Die drei Quotes beginnen eine Zeichenkette. Wenn du dann noch eins setzt, ist das Teil der Zeichenkette und damit falsch. Sagt dir jetzt der dritte hier.

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 19:01
von kiaralle
Ah, ok, hab ich wirklich falsch verstanden.

Ich breche den Code also nicht um. Oder gibt es einen anderen Weg damit die Zeile im Code nicht zu lang wird.

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 19:05
von sparrow
Ich habe nicht geschrieben, dass du nicht umbrechen sollst sondern, dass du bei Tupeln _nach jedem Element_ einfach umrechen kannst.
Und dass da einmal Anfühungszeichen zu viel sind.

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 19:20
von kiaralle
Läuft

Code: Alles auswählen

 statement = "INSERT INTO slave (\
                status , vpv1 , vpv2 , ppv1h , ppv1l ,\
                buck1curr , buck2curr , op_watth , op_wattl , op_vah ,\
                op_val , acchr_wtth , acchr_wattl , acchr_vah , acchr_val ,\
                bat_volt , batterysoc , busvolt , gridvolt , linefreq ,\
Manchmal dauert es etwas :-)

Danke

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 19:22
von sparrow
Warum nicht?!?:

Code: Alles auswählen

 statement = """
    INSERT INTO slave (
        status , vpv1 , vpv2 , ppv1h , ppv1l ,
        buck1curr , buck2curr , op_watth , op_wattl , op_vah ,
        op_val , acchr_wtth , acchr_wattl , acchr_vah , acchr_val ,
        bat_volt , batterysoc , busvolt , gridvolt , linefreq ,
    ....
"""
?

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 19:35
von Sirius3
Das ist doch alles ziemlich Fehleranfällig, wenn Register Nummer 47 warnvalue entspricht, oder doch vielleicht checkstep? Deshalb vermeidet man so lange Ausdrücke generell, und hat dann nicht dass große Problem, einen Ausdruck auf 30 Zeilen aufteilen zu müssen. Deshalb hat man normalerweise eine Tabelle, in der Messungs-ID, Name,Wert gespeichert werden.
Was möchtest Du eigentlich mit Deiner Tabelle machen? Welche Abfragen sollten darauf gemacht werden? Was ist der Zweck des ganzen?

Re: Code umbrechen

Verfasst: Mittwoch 8. Mai 2024, 20:42
von kiaralle
Ich möchte nur die Register mit schreiben.
Den letzten Eintrag verwende ich in einer PHP-Seite zur Info.
Falls ich mal Probleme habe, kann ich dann 12h zurück schauen warum ein Wechselrichter was gemacht hat. Nach 12h werden alte Einträge gelöscht.
Mehr eigentlich nicht.