Zerlegen einer Zeile

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
Franzel007
User
Beiträge: 13
Registriert: Freitag 12. August 2016, 15:46

Hallo zusammen,

nach vier Wochen intensiever Einarbeitung in Python3 bin ich auf das Problem gestoßen, dass ich folgende Programmzeile nicht wie gewohnt in mehrer Zeilen teilen kann. Woran das liegt und welche Lösungs es gäbe dabie könnt ihr mich sicherlich Hilfeleistung geben.

Code: Alles auswählen

cursor.execute ("INSERT INTO wetterdaten (Datum, Uhrzeit, Temperatur_DHT, Luftfeuchte_DHT, Temperatur_BMP, Luftdruck_BMP, Hoehe_BMP) VALUES (%s, %s, %s, %s, %s, %s, %s)",(date, time, temperatur_dht, luftfeuchte_dht, temperatur_bmp, druck_bmp, hoehe_bmp ))
Gruß
Franzel
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst zum eine triple-Quotes verwenden

'''Dies ist
ein
mehrzeiliger
Text'''

Zum anderen das tupel mit Parametern aufteilen

(a,
b,
c,
)

Sowohl bezogen auf execute(...) als auch die Werte für die Abfrage.
narpfel
User
Beiträge: 690
Registriert: Freitag 20. Oktober 2017, 16:10

Moin,

was genau meinst du damit, dass du diese Zeile nicht mehr zerlegen kannst?

Allgemein kann man in Python Ausdrücke immer in Teilausdrücke zerlegen, indem man die Ergebnisse der Teilausdrücke an Namen bindet. In der von dir gezeigten Anweisung gibt es drei Teilausdrücke:
  • Code: Alles auswählen

    cursor.execute
    
  • Code: Alles auswählen

    "INSERT INTO wetterdaten (Datum, Uhrzeit, Temperatur_DHT, Luftfeuchte_DHT, Temperatur_BMP, Luftdruck_BMP, Hoehe_BMP) VALUES (%s, %s, %s, %s, %s, %s, %s)"
    
  • Code: Alles auswählen

    (date, time, temperatur_dht, luftfeuchte_dht, temperatur_bmp, druck_bmp, hoehe_bmp )
    
Diese können nicht weiter zerlegt werden, wenn man davon absieht, den String oder das Tupel aus kleineren Strings bzw. Tupel zusammenzubauen.
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

@Franzel007: wie hast Du versucht, das in mehrere Zeilen zu schreiben?

hier mal als Beispiel:

Code: Alles auswählen

cursor.execute("INSERT INTO wetterdaten "
    "(Datum, Uhrzeit, Temperatur_DHT, Luftfeuchte_DHT, "
    "Temperatur_BMP, Luftdruck_BMP, Hoehe_BMP) VALUES "
    "(%s, %s, %s, %s, %s, %s, %s)", (date, time, temperatur_dht,
    luftfeuchte_dht, temperatur_bmp, druck_bmp, hoehe_bmp))
Es ist übrigens schlechtes Datenbankdesign, Datum und Uhrzeit in zwei getrennten Feldern zu speichern. Fasse das in ein TIMESTAMP-Feld zusammen.
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

__deets__ hat geschrieben:Du kannst zum eine triple-Quotes verwenden

'''Dies ist
ein
mehrzeiliger
Text'''

(...)
Mit triple-Quotes ist das nicht mehr der selbe String, da nun die Zeilenumbrüche im String enthalten sind. Natürlich kann das in Situationen wie dieser als Workaround verwendet werden, ist aber gar nicht nötig. Sirius hat hier gezeigt, wie man einen String auf mehrere Teile zerlegen kann.

Code: Alles auswählen

"Das ist "
"ein einzeiliger"
' String'
ist der gleiche String wie

Code: Alles auswählen

"Das ist ein einzeiliger String"
Hier ist das in der Python Dokumentation beschrieben.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist zwar richtig, im Kontext von SQL Statements aber irrelevant, und dein Vorgehen im Gegenteil fehleranfälliger, da die Zeilen ohne Space verbunden werden. Wodurch man also aufpassen muss, am Ende oder Anfang ein Leerzeichen einzufügen.

Insofern würde ich hier immer zu triple quotes raten.
Franzel007
User
Beiträge: 13
Registriert: Freitag 12. August 2016, 15:46

Hallo nochmal,

leider bekomme ich es so nicht hin. Mit den ''' geht es nicht, obwohl ich es sonst so mache.
Beim dem SQL schein es nicht zu funktionieren warum auch immer.
Auf die Lehrzeichen habe ich expizit geachtet.

Ich mache wohl etwas nicht so wie es sein sollte.

Gruß
Franzel
Franzel007
User
Beiträge: 13
Registriert: Freitag 12. August 2016, 15:46

Hallo narpfel,

so habe ich es gemacht, geht auch, aber meine Originalzeit ist schon sehr lang (die oben ist nur ein gekürztes Beispiel) und deine Lösung bringt zwar eine leichte Verbesserung, aber ich würde die Zeilen gerne in kleinere Teilstück untereinander darstellen.

Gruß
Franzel
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

„Geht nicht“ ist keine gute Fehlerbeschreibung. Und ohne Code kann man dann halt auch nur mit den Achseln zucken.
Franzel007
User
Beiträge: 13
Registriert: Freitag 12. August 2016, 15:46

Hallo nochmal,

so nun die ganze Zeile wie sie funktioniert aber natürlich sehr lang ist und ich bekomme die einfach nicht geteil ohne das sie nocht geht.

Code: Alles auswählen

cursor.execute ("INSERT INTO wetterdaten (Datum, Uhrzeit, Temperatur_DHT, Luftfeuchte_DHT, Temperatur_BMP, Luftdruck_BMP, Hoehe_BMP, MQ2_digital, MQ7_digital, MQ135_digital, Regen_digital, Schall_digital, Schall_analog, UV_Level, Licht_analog, MQ2_ppm, MQ7_ppm, MQ135_ppm, Regen_analog, Licht_Lux_1, Licht_Lux_2 ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s )",(date, time, temperatur_dht, luftfeuchte_dht, temperatur_bmp, druck_bmp, hoehe_bmp, mq_2_digital, mq_7_digital, mq_135_digital , regen_digital, schall_digital, schall_analog, uv_level, licht_klartext, mq_2_ppm, mq_7_ppm, mq_135_ppm, regen_klartext, licht_lux_1, licht_lux_2))

Gruß
Franzel
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

@Franzel007: nicht, dass ich schon geschrieben hätte, wie's geht. Was hast Du denn nun konkret versucht, was nicht funktioniert?
Franzel007
User
Beiträge: 13
Registriert: Freitag 12. August 2016, 15:46

Hallo,

ich habe zuerst Tip 1 versucht
'''Dies ist
ein
mehrzeiliger
Text'''

dann dein Tip
cursor.execute("INSERT INTO wetterdaten "
"(Datum, Uhrzeit, Temperatur_DHT, Luftfeuchte_DHT, "
"Temperatur_BMP, Luftdruck_BMP, Hoehe_BMP) VALUES "
"(%s, %s, %s, %s, %s, %s, %s)", (date, time, temperatur_dht,
luftfeuchte_dht, temperatur_bmp, druck_bmp, hoehe_bmp))

aber egal wie ich es mache, geht es nicht. Ich denke ich mache da ein Fehler, denn ich immer wiederhole und es mir nicht bewußt wird.
Wenn ich die von euch gemachten Änderungen zurück nehme, geht es immer wieder. Mehrmals versucht und auch funktioniert.

Ich werde es weiter versuchen. Hier nochmal das Original und dann meine Änderung.

Code: Alles auswählen

cursor.execute ("INSERT INTO wetterdaten (Datum, Uhrzeit, Temperatur_DHT, Luftfeuchte_DHT, Temperatur_BMP, Luftdruck_BMP, Hoehe_BMP, MQ2_digital, MQ7_digital, MQ135_digital, Regen_digital, Schall_digital, Schall_analog, UV_Level, Licht_analog, MQ2_ppm, MQ7_ppm, MQ135_ppm, Regen_analog, Licht_Lux_1, Licht_Lux_2 ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s )",(date, time, temperatur_dht, luftfeuchte_dht, temperatur_bmp, druck_bmp, hoehe_bmp, mq_2_digital, mq_7_digital, mq_135_digital , regen_digital, schall_digital, schall_analog, uv_level, licht_klartext, mq_2_ppm, mq_7_ppm, mq_135_ppm, regen_klartext, licht_lux_1, licht_lux_2))

Code: Alles auswählen

cursor.execute ("INSERT INTO wetterdaten "
    "(Datum, Uhrzeit, Temperatur_DHT, Luftfeuchte_DHT, Temperatur_BMP, Luftdruck_BMP, Hoehe_BMP, "
    "MQ2_digital, MQ7_digital, MQ135_digital, Regen_digital, Schall_digital, Schall_analog, UV_Level, "
    "Licht_analog, MQ2_ppm, MQ7_ppm, MQ135_ppm, Regen_analog, Licht_Lux_1, Licht_Lux_2 ) VALUES "
    "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s )",(date, time, 
    temperatur_dht, luftfeuchte_dht, temperatur_bmp, druck_bmp, hoehe_bmp, mq_2_digital, mq_7_digital, 
    mq_135_digital , regen_digital, schall_digital, schall_analog, uv_level, licht_klartext, mq_2_ppm, 
    mq_7_ppm, mq_135_ppm, regen_klartext, licht_lux_1, licht_lux_2))
Ich komme einfach nicht drauf was falsch sein könnte :-(

Gruß
Franzel
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Geh schrittweise vor, und pruefe nach jedem Schritt:

- pack das SQL in drei """.
- brich irgendwo im SQL nach einem Komma oder Teilausdruck um, zB nach dem wetterdaten und VALUES.
- brich irgendwo in deinem Parameter-Tupel um, nach einem Komma.
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

@Franzel007: jetzt wäre es noch gut, die Fehlermeldung zu wissen, die Du angeblich wegen den Zeilenumbrüchen bekommst, dann das was Du da zeigst ist korrektes Python. Eine gut gestellte Frage besteht aus der Beschreibung des Ziels, was man versucht hat, was man als Ergebnis (also Ausgabe oder Fehler inklusive komplettem Traceback) bekommt und der Besschreibung, was man eigentlich erwartet hat.
Franzel007
User
Beiträge: 13
Registriert: Freitag 12. August 2016, 15:46

Hallo Sirius,

das Problem besteht genau daraus, dass ich eben keine Fehlermeldung bekomme. Es wird einfach nicht in die SQL Datenbank eingetragen.

Gruß
Franzel
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kann ich mir schwer vorstellen. Zeig mal bitte genau was du gemacht hast.
Antworten