Python mysql -1/unknown hiba

Python mysql -1/unknown hiba
2020-02-12T13:01:08+01:00
2020-02-13T23:58:53+01:00
2022-10-15T21:16:22+02:00
wizkid
Sziasztok!

Ez a kód egy while ciklusban van benne. És első lefutásra jó, kiírja hogy ok. Viszont második lefutásra már azt írja ki hogy -1/unknown , szerintetek miért?

Azt szeretném elérni, hogy ha a data táblában levő 2. rekord értéke 1 , akkor írja ki hogy ok.

mydb = mysql.connector.connect( host="localhost", user="root", passwd="sss", database="sssss" ) mycursor = mydb.cursor() sql = "INSERT INTO open_device (date, device, status) VALUES (%s, %s, %s)" val = (date_time, "Ajto", "Zarva") mycursor.execute(sql, val) mydb = mysql.connector.connect( host="localhost", user="root", passwd="sss", database="sssss" ) sql_select_Query = "select * from data" cursor = mydb.cursor() cursor.execute(sql_select_Query) records = cursor.fetchall() print("Total number of rows in Laptop is: ", cursor.rowcount) for row in records: if(row[1] == "1"): print "ok"
Mutasd a teljes hozzászólást!
Ha már ilyen wallOfText-nél tartunk akkor a legegyszerűbben a try except FINALLY hármasból használnék kettőt. A finally azért hasznos mert bármi történik a programoddal a program futás végén az itt szereplő kód még végrehalytódik. így le lehet zárni file-okat(pl: lapalján van egy egyszerű példa), normál állapotba lehet állítani a GPIO-t, felszabadítani lefoglalt erőforrásokat vagy mint esetedben le lehet vele zárni egy SQL kapcsolatot (nem tudom miért van szükséged ekkora sql erőforrásra, ha nem komplex a feladat szerintm elég lenne egy SQLite)
És a gyári 2.7-es doksi: 8. Errors and Exceptions — Python 2.7.17 documentation

try:
  mysql.open
  while a végtelenbe és tovább:
    kiolvasás-értékelés-rögzítés (ahogy szeretnéd)

finally:
  mysql.close
  bármi

Szóval szerintem ez a legfaékebb megoldás, de elgondolkodhatsz azon is hogy hogyan lehet ezt a feladatot szétdarabolni és funkciókkal vagy objektumokkal megoldani

(és ha már mysql, mysql date-and-time-functions . Nem kell szüttyögni programból, majd a szerver tuja hogy mennyi az idő, utána meg úgy válogatod le és olyan formában ahogyan te szeretnéd /sokat kellett statisztikáznom, sejtem hogy miről beszélek :) /)

ui: ha kívülről látszik a pi-d akkor ne tegyél fel pma-t! a saját logjaimból itélve előszeretettel próbálják azt is feltörni
Mutasd a teljes hozzászólást!

  • Mellékeltem képet.
    Egyszerűsítettem a kódot, de ugyanúgy ezt írja ki.

    mycursor = mydb.cursor() sql = "INSERT INTO open_device (date, device, status) VALUES (%s, %s, %s)" val = (date_time, "Ajto", "Zarva") mycursor.execute(sql, val) mydb.commit() mySql_select_Query = "select * from data" mycursor.execute(mySql_select_Query) record = mycursor.fetchone() price = float(record[1]) if(price == 1): print "ok" if (mydb.is_connected()): mycursor.close() mydb.close()
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Megmutathatnád a teljes kódot!
    Még jobb lenne, ha rámutatnál arra a sorra, ahol a hiba keletkezik!

    A mydb.close() gondolom zárja a DB connection-t.
    Ez megtörténik egyből az első futás végén? Ha igen, akkor utána újranyitod, vagy mi?
    Mutasd a teljes hozzászólást!
  • Így néz ki :(Igazából most nézem hogy lefut az if(price == 1) rendesen, ha nem íratom ki oda a print "ok" -t)

    import datetime import time import RPi.GPIO as GPIO import mysql.connector import subprocess import wget import os from time import sleep GPIO.setmode(GPIO.BCM) GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # Read from pin 11 GPIO.setup(26,GPIO.OUT) led = 0 prev_input = 0 while True: sleep(0.1) input = GPIO.input(16) if((prev_input==GPIO.LOW) and (input==GPIO.HIGH)): GPIO.output(26, 0) now =datetime.datetime.now() # Datum , ido year = now.strftime("%Y") month = now.strftime("%m") day = now.strftime("%d") time = now.strftime("%H:%M:%S") date_time = now.strftime("%Y/%m/%d %H:%M:%S") #print("Date and time: ",date_time) mydb = mysql.connector.connect( host="localhost", user="root", passwd="xxx", database="xxx" ) mycursor = mydb.cursor() sql = "INSERT INTO open_device (date, device, status) VALUES (%s, %s, %s)" val = (date_time, "Ajto", "Zarva") mycursor.execute(sql, val) mydb.commit() mySql_select_Query = "select * from data" mycursor.execute(mySql_select_Query) record = mycursor.fetchone() price = float(record[1]) if(price == 1) print "ok"
    Mutasd a teljes hozzászólást!
  • Az indentálást a prog.hu fórummotor rontotta el? Mert ha nem, akkor az utolsó print "ok" sort kicsit beljebb kellene tolni nem?
    A mysql connect-et szerintem rakd ki a ciklus elé!

    Jó lenne kideríteni, hogy KONKRÉTAN melyik sorban hal meg a dolog!
    Mutasd a teljes hozzászólást!
  • Igen a prog.hu rontotta el, az ott jó helyen van egyébként csak elcsúsztatta.

    Oké, kirakom.


    * Nem jó ha kirakom, nem csatlakozik akkor hozzá.
    Mutasd a teljes hozzászólást!
  • Hali!

    Az azért van, mert minden ciklusban lezárod a kapcsolatot; a kapcsolat lezárását is tedd a cikluson kívülre és akkor nem kell folyton újranyitni.
    Mutasd a teljes hozzászólást!
  • De ha már egyszer belép a ciklusba, akkor az onnan nem jön ki. Tehát ha kívülre teszem, az a kapcsolat sose lesz bezárva.
    Mutasd a teljes hozzászólást!
  • Ez így igaz, elkerülte a figyelmem, de miért is szükséges a végtelen ciklus?
    Mutasd a teljes hozzászólást!
  • Azért kell, mert folyamatosan figyelem a 16 - os láb állapotát. Ha az változik, akkor megy az adat mysql-be.
    Mutasd a teljes hozzászólást!
  • Ha már ilyen wallOfText-nél tartunk akkor a legegyszerűbben a try except FINALLY hármasból használnék kettőt. A finally azért hasznos mert bármi történik a programoddal a program futás végén az itt szereplő kód még végrehalytódik. így le lehet zárni file-okat(pl: lapalján van egy egyszerű példa), normál állapotba lehet állítani a GPIO-t, felszabadítani lefoglalt erőforrásokat vagy mint esetedben le lehet vele zárni egy SQL kapcsolatot (nem tudom miért van szükséged ekkora sql erőforrásra, ha nem komplex a feladat szerintm elég lenne egy SQLite)
    És a gyári 2.7-es doksi: 8. Errors and Exceptions — Python 2.7.17 documentation

    try:
      mysql.open
      while a végtelenbe és tovább:
        kiolvasás-értékelés-rögzítés (ahogy szeretnéd)

    finally:
      mysql.close
      bármi

    Szóval szerintem ez a legfaékebb megoldás, de elgondolkodhatsz azon is hogy hogyan lehet ezt a feladatot szétdarabolni és funkciókkal vagy objektumokkal megoldani

    (és ha már mysql, mysql date-and-time-functions . Nem kell szüttyögni programból, majd a szerver tuja hogy mennyi az idő, utána meg úgy válogatod le és olyan formában ahogyan te szeretnéd /sokat kellett statisztikáznom, sejtem hogy miről beszélek :) /)

    ui: ha kívülről látszik a pi-d akkor ne tegyél fel pma-t! a saját logjaimból itélve előszeretettel próbálják azt is feltörni
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd