Code umbrechen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kiaralle
User
Beiträge: 76
Registriert: Donnerstag 19. August 2021, 19:11

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
Sirius3
User
Beiträge: 17792
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
kiaralle
User
Beiträge: 76
Registriert: Donnerstag 19. August 2021, 19:11

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.
kiaralle
User
Beiträge: 76
Registriert: Donnerstag 19. August 2021, 19:11

Code: Alles auswählen

statement = """
                "INSERT INTO master(
                status , vpv1 , vpv2 , ppv1h , ppv1l ,
                buck1curr , buck2c
                ....
                
So wird es besser :-)
kiaralle
User
Beiträge: 76
Registriert: Donnerstag 19. August 2021, 19:11

Zu früh gefreut.
Benutzeravatar
__blackjack__
User
Beiträge: 13189
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die " um das Statement, die ja Bestandteil des *Inhalts* der Zeichenkette sind, sind halt falsch.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
kiaralle
User
Beiträge: 76
Registriert: Donnerstag 19. August 2021, 19:11

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()
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

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.
kiaralle
User
Beiträge: 76
Registriert: Donnerstag 19. August 2021, 19:11

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.
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

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.
kiaralle
User
Beiträge: 76
Registriert: Donnerstag 19. August 2021, 19:11

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
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

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 ,
    ....
"""
?
Sirius3
User
Beiträge: 17792
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
kiaralle
User
Beiträge: 76
Registriert: Donnerstag 19. August 2021, 19:11

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.
Antworten