RaspberryPi mti Datenbank und Python als abfragen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
co-se
User
Beiträge: 20
Registriert: Dienstag 20. Oktober 2020, 13:36

Hallo Leute,
es geht nicht um direkte DB abfragen wie man vermuten kann, sondern um IF schachteln.
Meine frage setzt sich aus vielen kleinen blöcken zusammen.
Ich habe 2 Programme bisher wo für sich laufen, aber ich will beide mit einem dritten alles unter 1 Programm am laufen haben.
Im Grunde soll so so sein:
1. Tag an Reader halten
2. Tag wird gelesen
3. ist TAG nicht in Tabelle 1, füge TAG in Tabelle 1 ein
4. ist TAG in Tabelle 1, dann prüfe ob TAG in Tabelle 3 ist, wenn TAG in Tabelle 3 ist, dann füge Daten aus Tabelle 3 nach Tabelle 2 hinzu, wenn TAG nicht in Tabelle 3 ist, dann Fehlermeldung

Meine gedachte bzw verstandene IF Abfragen
@@@ = ProgrammCode

Code: Alles auswählen

@@@ # Hauptteil
@@@
	IF a == b:
		@@@ # Unterprogramm
		@@@
@@@ # Hauptteil
@@@
weitere

Code: Alles auswählen

@@@ # Hauptteil
@@@
	#Begin Abfrage 1
	IF a == b: # UT1
		@@@
		@@@
		IF b != c:
			@@@ # Unterprogramm 1
			@@@
		ELIF b == c:	# 
			@@@ # Unterprogramm 2
			@@@
		ELSE:
			@@@ # Unterprogramm 3
			@@@
		@@@ # UT1 weiter fals vorhanden
@@@ # Hauptteil
@@@
Meine vermutung sollte hier ein schon ein Problem sein
Ist dort schon ein fehler ?
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn b!=c oder b==c dann gibt es keinen else-Teil mehr.

Das was Du da mit den Tabellen beschreibst, ist etwas komisch.
zu 3. Ein Tag in eine Tabelle 1 einzufügen, falls es nicht vorhanden ist, hört sich noch vernünftig an.
zu 4. Dann ist aber der Tag in Tabelle1 immer drin, warum sollte man das selbe nochmal mit einer dritten Tabelle machen? Und warum sollte man Daten von einer Tabelle2 in eine Tabelle3 kopieren. So funktionieren relationale Datenbanken nicht.
Kannst Du mal konkret werden, was in den Tabellen steht und was das Problem ist, das Du damit zu lösen versuchst?
co-se
User
Beiträge: 20
Registriert: Dienstag 20. Oktober 2020, 13:36

Ok mal anders anfangen
Ich habe 3 verschiede Tabellen auf 3 Server, weil jede Ding sein eigenes Schema hat
habe zum Testen mal 3 Tabellen in eine DB zusammen gefasst zum testen
Tabelle 1: speichert nur TAG Werte
Tabelle 3: hat infos wie : ID, Auto, Fahrad, Mofa, Quad, Ofen, Heizung, .... TAG Werte ( Wobei nicht alle TAG Werte aus Tabelle 1 verwendet werden ( es gibt mehr TAG Werte als Daten ))
Tabelle 2: soll werte aus Tabelle 3 bekommen wenn TAG Wert beim abfragen gefunden wurde.

Die TAG Werte aus Tabelle 1 werden über einen Webserver bei bedarf immer ind Tabelle 3 übertragen zu einer bestimmten ID
Der Webserver hat weitere funktionen noch, z.b. Diverse Werte von Ereignissen auf zu nehmen und mit ID aus Tabelle 3 in einer anderen Tabelle ( Tabelle4 ) zu speichern, welche wiederum zur späteren auswertung genutzt werden wo Plazierungen mit ausgegeben werden.

Tabelle 2 hat auch mehrere ID auf genommen aber es sollen nur gezielt eine ID abgefragt werden und aus gegeben werden ( praktisch ein Einzellverbindungsnachweis )

Mein Versuch

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-

import RPi.GPIO as GPIO
import MFRC522
import signal
import datetime
import time
import MySQLdb

db = MySQLdb.connect(host = "localhost",
                        user = "root",
                        passwd = "eadmin",
                        db = "test")
                        
GPIO.setmode(GPIO.BCM)

#GPIO.setup(16, GPIO.OUT)	#LED Rot
GPIO.setup(20, GPIO.OUT)	#LED Gelb
GPIO.setup(21, GPIO.OUT)	#LED Blau
#GPIO.output(16, GPIO.LOW)	#LED Rot
GPIO.output(20, GPIO.LOW)	#LED Gelb
GPIO.output(21, GPIO.LOW)	#LED Blau

#LED Gruen wird mit Einschalten von RaspberryPi gestartet

#LED Rot soll als Lesefehler leuchten fuer 3 Sekunden 
#LED Blau bereit zum scannen
#LED Gelb daten werden verarbeitet

valueart = Art
valueort = Ort


continue_reading = True
def end_read(signal,frame):
    global continue_reading
    print "\nProgramm beendet!"
    continue_reading = False
    GPIO.cleanup()
signal.signal(signal.SIGINT, end_read)
MIFAREReader = MFRC522.MFRC522()
print "Programm gestartet zum Karten scannen!"

#Alle Programme Begin
while continue_reading:
    GPIO.output(21, GPIO.HIGH)
    GPIO.output(21, GPIO.HIGH)
    (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
    (status,uid) = MIFAREReader.MFRC522_Anticoll()
        if status == MIFAREReader.MI_OK:
            card = str(uid[0]) + str(uid[1]) + str(uid[2]) + str(uid[3])
            GPIO.output(21, GPIO.LOW)
            GPIO.output(20, GPIO.HIGH)
            cur = db.cursor()
            cur.execute("SELECT * FROM dbvmgl")
            for row in cur.fetchall() :
                if card != row[18]:
                    #cur.execute("INSERT INTO rfid (tt01) VALUES (%s)", (card))
                    #file = open("card_in_id.txt", "a")
                    #file.write(card + "\n")
                    #file.close()
                    print "Tag wird in Tabelle 1 eingetragen"
                 elif card == row[18]:  
                    #valuehugo = row[3] +  " " + row[2]
                    #now =datetime.datetime.today()
                    #value1data = now.strftime('%Y-%m-%d')
                    #value2data = now.strftime('%Y')
                    #cur.execute("INSERT INTO ess (vsbid, vsbx0, vsbx1, vsb01, vsb02, vsb03, vsb31, vsb32) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)", (row[0], row[14], row[15], valuehugo, value1data, 'valueart', 'valueort', value2data))
                    print "Tag wird in Tabelle 2 eingetragen"
                 else: 
                    GPIO.output(16, GPIO.HIGH)
                    time.sleep(3)
                    print "Tag nicht in Tabelle 3 gefunden"
                    GPIO.output(16, GPIO.LOW)
        time.sleep(3)
        print("Next Card")
        GPIO.output(20, GPIO.LOW)
        GPIO.output(21, GPIO.HIGH)
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Wer hat denn in den letzten Tagen die vielen Leute mit MFRC522 losgelassen?

@co-se: Einrückungen sind in Python wichtig. Dein Code ist falsch eingerückt, so dass er nicht lauffähig ist.
Auch in Datenbanktabellen ist es wichtig, aussagekräftige Namen zu verwenden und keine kryptischen Abkürzungen. Was soll den dbmvgl bedeuten?
SQL-SELECTS haben den Vorteil, dass man das Ergebnis filtern kann. Das in Python in einer for-Schleife zu tun, ist falsch.
Da gehört also ein

Code: Alles auswählen

cur.execute("SELECT was, du, wirklich, brauchst FROM dbvmgl where wieauchimmerrow18heißt = %s", [card])
hin. Was dann passieren soll, ist aber immer noch seltsam.

Auch wenn man viele Services hat, die auf unterschiedlichen Servern laufen, dann darf es keine duplizierten Daten geben. Deine Services sind also schlecht zugeschnitten. Als erstes solltest Du also eine klare Verantwortlichkeit der Services herstellen, so dass es keine Überschneidungen mehr gibt.
co-se
User
Beiträge: 20
Registriert: Dienstag 20. Oktober 2020, 13:36

habe fehler schon gesehen
aber ich suche meine denkfehler
tabelle (1) "rfid" enthällt ID und TAG-Werte
tabelle (3) "dbvgml" zusatz daten
tabelle (2) "ess" soll daten aufnehmen
vor mir waren Leute dran wo alles erstellt haben
ich soll alles zusammen führen, ohne großen aufwand

Code: Alles auswählen

    if status == MIFAREReader.MI_OK:
            card = str(uid[0]) + str(uid[1]) + str(uid[2]) + str(uid[3])
            print card
            cur = db.cursor()
            cur.execute("SELECT * FROM rfid")
            for row in cur.fetchall() :
                if row[01] != card:
                    #cur.execute("INSERT INTO rfid (tt01) VALUES (%s)", (card))
                    #file = open("card_in_id.txt", "a")
                    #file.write(card + "\n")
                    #file.close()
                    print "Tag wird in Tabelle 1 eingetragen"
            curo = db.cursor()
            curo.execute("SELECT * FROM dbvmgl")
            for riw in cur.fetchall() :
                if riw[18] == card:  
                    print "Tag wird in Tabelle 2 eingetragen"
            time.sleep(3)
            print("Next Card")
Chip ist aber nicht in Tabelle 1
Wenn ich eine Chip anhalte kommt meldung "Tag wird in Tabelle 2 eingetragen"
co-se
User
Beiträge: 20
Registriert: Dienstag 20. Oktober 2020, 13:36

Besten Dank program steht nun
Antworten