Raspberry 3 ja Raspberry 4 nein python und datenbank

  • Code


    Inhahalt meiner Datenbank bzw erstellen von Tabellen


    meine Databankfelder

    Python

    JoyIT Reader


    Soweit mein script, es klapt inzern Raspian Jessie mit Raspberry 3/ 3B ( Stretch habe ich unter den 3B+ )

    allerdings habe ich die alten Mifare ~ JoyIT einträge angepasst hier

    mein urcode

    Code

    passte für Mifare und JoyIT Reader

    Bitte darüber hinweg sehen fals hier abstände nicht immer passen

    Abruchmeldung mit cleanup() soweie datenbank auslesen klapt nicht

    was ich nicht verstehe unter dem alten PI klapts beim neuen nicht

    warum ?

  • Hallo,


    ich kann dir nicht ganz folgen. Kannst du bitte zeigen welches Skript du benutzt und welche Fehlermeldungen du erhälst? (Die vollständige Fehlermeldung in Code-Tags hier rein kopieren).

    Zeig uns auch bitte wie das Skript gestartet wird.



    Habe dies aufgegeben

    Ein Versuch starten wir mal, oder? ;)


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Ok versuchen wir es


    Datenbank Felder/Tabellen


    python3 r.py

    So bekomme ich jede dbid angezeigt

    Code
    mycursor = mydb.cursor()
        mycursor.execute("SELECT * FROM db WHERE db03 = 'ck'")
        result = mycursor.fetchall()
        for data in result:
            print(data[0])

    ich brauche nur db02 und db01 aus db ( data[1] , data[2] ) ist mir klar

    im anchluß werden alle werteck, "datum, jahr, zeit, data[1], data[2]" in eine andere Tabelle geschrieben

    mit print kann ich mir ja Infos/Daten anzeigen lassen


    allerdings bekomme ich fehler meldungen mit dem hinweis auf die "where"

    aber nicht das wo ich brauche


    ein Abbruch mit STRG + C ist auch nicht möglich




  • Grüße dich,


    Mal eben auf die schnelle.


    Da es sowieso kommt, die obligatorische Empfehlung für GpioZero statt RPigpio.


    Dann müsste theoretisch das

    signal.signal(signal.SIGINT, end_read) mit in die while-Schleife.


    Das du Global nutzt übersehen wir jetzt einfach mal, denn ich habe ehrlich gesagt noch nicht ganz verstanden was das Problem ist.

    Du hast jetzt nen 4er Pi mit einem veraltetem OS worauf dein Script nicht mehr läuft und welches Problem hast du mit der DB?


    Wir sind mittlerweile bei Raspbian Buster.


    Wichtig wäre auch:

    Die vollständige Fehlermeldung in Code-Tags hier rein kopieren

  • ich habe einen 3er pi mit jessie wo es läuft unter python 2

    da habe ich einen Card reader wo mit python 2 läuft, bzw daten vom reader in db eingetragen werden

    mit php unter html kann ich daten auslesen und weiter bearbeiten

    was ich unter den 3er am laufen hatte habe ich aus dem internet heraus zusammen gesetzt

    der 3er pi wird nicht mehr unterstützt also wollte ich alles auf den 4er übertragen

    das mit dem reader habe ich gelöst bekommen

    mit python3 bekomme ich daten eingetragen und auch ausgelesen beim auslesen klappt nicht alles

    "select * from db where db03 = x"

    das klappt nicht

    Quote


    Da es sowieso kommt, die obligatorische Empfehlung für GpioZero statt RPigpio.

    habe ein dickes buch über raspberry, dort habe ich auch RPi.GPIO entnommen

  • pi@raspberrypi:~/mfrc $ python3 tr.py

    File "tr.py", line 77

    sql = "SELECT * FROM db WHERE db03 = '" + id + "'"

    ^

    IndentationError: unexpected indent


    eine von vielen

    bae alles nochmal neu zusammen gestellt

  • IndentationError: unexpected indent


    Du hast irgendwo einen Einrückungsfehler höchstwahrscheinlich vor der Angezeigten Zeile, also vor:

    sql = "SELECT * FROM db WHERE db03 = '" + id + "'"


    Welches ist dann dein aktuell benutztes Script?


    Es wäre schön wenn du die komplette Fehlermeldung in Code-Tags setzen würdest. Das macht es Übersichtlicher für alle.

    Das geht mit den </> Zeichen in der Leiste wenn du eine Nachricht schreibst.


    Gibt es einen Grund warum du nicht das neuste Raspbian benutzt?

  • Wie ich es mir vorgestellt habe

  • Beim kurzem Überfliegen deines Codes am Telefon, die Einrückungen ab Zeile 141 passen nicht .


    Strings baut man nicht mit dem + sondern mit der format Methode oder mit f strings.


    Dein Code vom Beitrag 10 passt auch nicht zum Fehler im Beitrag 8. Bitte immer den aktuellen Code zum Fehler zeigen.


    Gruß

    Steinardo

  • Du hast ab Zeile 141, also in der while-Schleife, alles falsch eingerückt. Deswegen kommt die Fehlermeldung: IndentationError: unexpected indent

    Python verzeiht dir das nicht da Python sonst nicht weiß wie es deinen Code lesen muss.


    Schau dir mal das HIER an und lies dich da ein oder wenn du Englisch kannst, kannst du dir gleich die offizielle Doku zu Python anschauen.


    Die Fehlermeldungen kannst du auch googeln. Da kommt meist brauchbarer kram bei rum.

  • genau da ist mein problem in zeile 141

    besser gesagt ab WHERE

    RaspberryPi dickes Buch

    Python3 ( das umfassende Handbuch ( RheinwerkComputing )

    haben nichts genaues darüber stehen ( beispiel code )

    eine kleine änderung am code

    diese kleine änderung klappt

    bekomme daten angezeigt auch nur was unter db03 eingetragen worden ist die andren 100 zeilen nicht

    wie bekomme ich " id " nach " 797222799489 "

    Code
    sql = "SELECT * FROM db where db03=797222799489"
    
    sql = "SELECT * FROM db where db03=????"

    ???? dafür suche ich erst mal eine lösung

  • Z.b mit f-Strings. Ändere mal Zeile 80 in sql = f'SELECT * FROM db WHERE db03={id}'. Damit fügst du die Variable id zwischen den geschweiften Klammern in den string ein.


    Code
    >>> id = 123456
    >>> sql = f'SELECT * FROM db WHERE db03={id}'
    >>> print(sql)
    SELECT * FROM db WHERE db03=123456
    >>> type(sql)
    <class 'str'>
  • Hallo,


    in den Büchern mag 'RPi' vorgeschlagen werden, das kann jetzt trotzdem veraltet sein.

    Zu deinem Code:

    Python3 benötigt keine 'coding' Angabe.

    Verwende 'gpiozero' anstatt 'RPi'.

    'mysql' und 'os' werden importiert aber nicht genutzt.

    Auf Modulebene (Die Ebene ohne EInrückungen) sollte kein ausführbarer Code stehen. Hier werden nur Klassen, Funktionen und Konstanten definiert. Jede ausführbare Codezeile gehört in eine Funktion. Üblicherweise steht das Hauptprogramm in einer Funkion mit dem Namen 'main'. Von dort aus werden Funktionen aufgerufen, Argumente(die Namen in den Klammern) übergeben und Rückgaben entgegengenommen.

    Verwende immer sprechende Namen, 'itess04' ist für mich zum Beispiel absolut nichts sagen und es wird in deinem Code aus Beitrag 13 auch nicht weiterverwendet. Wenn du Namen irgendwie durchnummerieren musst, dann verwendet man meist eher eine Liste. Da die Namen aber eh nicht verwendet werden, können die erst mal weg.

    Wenn du einen Namen in einen String umwandelst, dann musst du dafür keinen neuen Namen erfinden, wie du es mit 'iid' machst. Benötigst du die Umwandlung überhaupt? Wird ja in den 'sql'-String eingebaut.

    'id' ist auch ein schlechter Name, da es in Python eine Funktion mit diesem Namen gibt, siehe hier.

    Du solltest auch dafür sorgen, dass die Verbindung zur Datenbank wieder beendet wird, auch wenn das Programm nicht wie gewünscht beendet wird. Dafür kann man das 'with'-Statemant nutzen. Allerdings unterstützen das nur sogenannte Kontextmanager. In deinem Fall kann man sich mit 'closing' aushelfen. Das sorgt jetzt dafür, dass die Verbindung beendet wird, sobald das Programm beendet wird, oder der 'with'-Block verlassen wird.

    Ungetestet:


    Manche Sachen wurden zwischenzeitlich ja schon angesprochen, da ich zwischen durch mal Abendessen war, lasse ich aber alles drin ^^


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

    Edited once, last by Dennis89: Schreibfehler verbessert, Danke Steinardo ().

  • Ok kann langsam folgen

    Nun tauchen weitere fragen auf

    1. "def abbruch(signal, frame):" wo ich habe

    dieser block ist mir klar, er steht für sich wie die anderen "def"

    aber meine Zeile 42 wo bringe ich die unter ( aufruf von abbruch def )

    2. "LEDs" ich habe 4 Stück gewählt

    1. Blau = Prgramm geladen (gestartet)

    2. Grün = Leuchtet = Bereit zum Scannen, Blinkt = Chip nicht mehr anhalten

    3. Gelb = Daten werden verarbeitet

    4. Rot = Chip nicht zugeordnet

    ich verstehe nicht mehr wie einzusetzen nun

    3. Zeile 28 von Dir print(id)

    ich denke das bewirkt nichts weil ich kein bezug auf id finde

    aber aus meine code ja war hilfe zum code verstehen bzw um richtigen chip zu testen

    4. Zeile 38 von Dir

    alles was ich gefunden hatte darunter

    for row in result:

    print(row) = ok verstehe ich

    aber

    row[0] = sollte mir 1 wert aus Tabelle geben

    row[1] = sollte mir 2 wert aus Tabelle geben

    row[2] = sollte mir 3wert aus Tabelle geben

    aussehen

    Wert1 = row[0]

    ...

    Bin ich da auch wieder falsch informiert ?

  • Guten Morgen,


    du hast in deinem Programm nur zwei Led's genutzt, daher habe ich auch nur zwei eingebaut. Du kannst die Liste 'leds' einfach erweitern und mit fortlaufendem Index auf die Liste zugreifen. leds[0] gibt dir zum Beispiel das erste Element der Liste.

    'print(id)' müsste 'print(card_id)' heißen. Ich habe den Namen nachträglich geändert und das wohl übersehen.

    Bin ich da auch wieder falsch informiert ?

    Da kann ich dir nicht ganz folgen. Ich habe da eigentlich nur deinen Code kopiert, da ich nicht wirklich weis was du eigentlich vor hast. (Daher ist mein Name 'write_in_database' bis jetzt auch noch falsch).


    Kannst du uns mal erklären/zeigen wie deine Datenbank aufgebaut ist und was genau passieren soll, wenn ein Chip erkannt wird?

    Sollen nur Daten ausgelesen werden?


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?