Seite 1 von 1

Fehler ValueError: too many values to unpack (expected 3) bei RFID Zeiterfassung

Verfasst: Montag 4. September 2023, 14:40
von Susie
Hallo zusammen,

ich versuche mich gerade an einem Raspberry Pi RFID Zeiterfassungstool.

Code: Alles auswählen

#!/usr/bin/env python
import time
from contextlib import closing

import drivers
import mysql.connector
from mfrc522 import SimpleMFRC522
from RPi import GPIO


def main():
    try:
        with closing(
            mysql.connector.connect(
                host="localhost",
                user="***",
                passwd="***",
                database="attendancesystem",
            )
        ) as db:
            with db.cursor() as cursor:
                reader = SimpleMFRC522()
                lcd = drivers.Lcd()
                try:
                    while True:
                        lcd.lcd_clear()
                        lcd.lcd_display_string("Place Card to", 1)
                        lcd.lcd_display_string("record attendance", 2)
                        rfid, _ = reader.read()


                        search_rfid_sql = "SELECT * FROM users JOIN attendance ON user_id = in_or_out = 1 and rfid_uid = %s"

                        cursor.execute(search_rfid_sql,[rfid],)


                        result = cursor.fetchone()

                        lcd.lcd_clear()

                        if result:
                            user_id,username,in_or_out = result

                            if in_or_out == 1:
                                print("du bist schon angemeldet")
                            else:
                                lcd.lcd_display_string(f"Welcome {username}.", 1)
                                insert_coming_sql = "INSERT INTO attendance (user_id, in_or_out) VALUES (%s, 1);"

                                cursor.execute(insert_coming_sql, (user_id,))
                                db.commit()
                        else:
                            lcd.lcd_display_string("User does not exist.", 1)

                        time.sleep(2)

                finally:
                    lcd.lcd_clear()
    finally:
        GPIO.cleanup()


if __name__ == "__main__":
    main()
Das Problem: ich bekomme immer ein
ValueError: too many values to unpack (expected 3)
und ich habe keine Ahnung wie ich das umgehen kann, dafür bin ich noch zu blutiger Anfänger und kapiere es einfach nicht.

meine DB sieht so aus:

Code: Alles auswählen

MariaDB [attendancesystem]> DESCRIBE attendance;
+-----------+------------------+------+-----+---------------------+----------------+
| Field     | Type             | Null | Key | Default             | Extra          |
+-----------+------------------+------+-----+---------------------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| user_id   | int(10) unsigned | NO   |     | NULL                |                |
| clock_in  | timestamp        | NO   |     | current_timestamp() |                |
| in_or_out | tinyint(1)       | YES  |     | 0                   |                |
| clock_out | date             | YES  |     | NULL                |                |
+-----------+------------------+------+-----+---------------------+----------------+
5 rows in set (0,011 sec)

MariaDB [attendancesystem]> DESCRIBE users;
+----------+-----------------------------+------+-----+---------------------+----------------+
| Field    | Type                        | Null | Key | Default             | Extra          |
+----------+-----------------------------+------+-----+---------------------+----------------+
| id       | int(10) unsigned            | NO   | PRI | NULL                | auto_increment |
| rfid_uid | varchar(255)                | NO   |     | NULL                |                |
| name     | varchar(255)                | NO   |     | NULL                |                |
| created  | timestamp /* mariadb-5.3 */ | NO   |     | current_timestamp() |                |
+----------+-----------------------------+------+-----+---------------------+----------------+
4 rows in set (0,010 sec)
Vielleicht kann mir ja jemand zu dem Fehler einen Tipp geben.

Danke schon mal
Gruß
Susie

Re: Fehler ValueError: too many values to unpack (expected 3) bei RFID Zeiterfassung

Verfasst: Montag 4. September 2023, 14:42
von __deets__
Bitte die vollstaendige Fehlermeldung posten, und nicht eine reduzierte Version, an der man die Code-Stelle nicht erkennen kann.

Re: Fehler ValueError: too many values to unpack (expected 3) bei RFID Zeiterfassung

Verfasst: Montag 4. September 2023, 14:53
von Susie
Sorry tut mir leid... nicht daran gedacht:
Traceback (most recent call last):
File "/home/susie/attendancesystem/test.py", line 64, in <module>
main()
File "/home/susie/attendancesystem/test.py", line 42, in main
user_id,username,in_or_out = result
ValueError: too many values to unpack (expected 3)

Re: Fehler ValueError: too many values to unpack (expected 3) bei RFID Zeiterfassung

Verfasst: Montag 4. September 2023, 14:54
von Sirius3
Bei einem "SELECT *" bekommst Du halt alle Felder und nicht nur die drei, die Du anscheinend möchtest.
Gib bei SELECT die Felder explizit an.
Warum ist clock_in vom Typ timestanp clock_out aber ein Date? Und warum überhaupt beides, wo es doch das Flag in_or_out gibt?

Re: Fehler ValueError: too many values to unpack (expected 3) bei RFID Zeiterfassung

Verfasst: Montag 4. September 2023, 15:00
von Susie
OMG das war einfach, danke für den push!!!

Hätte ich auch selbst drauf kommen könnt! :roll:

Dann werde ich mal weiter machen und hoffen dass ich ohne eure Hilfe weiterkomme.

Danke
VG
Susie

Re: Fehler ValueError: too many values to unpack (expected 3) bei RFID Zeiterfassung

Verfasst: Montag 4. September 2023, 15:04
von Susie
Sirius3 hat geschrieben: Montag 4. September 2023, 14:54 Warum ist clock_in vom Typ timestanp clock_out aber ein Date? Und warum überhaupt beides, wo es doch das Flag in_or_out gibt?
in_or_out ist nur falsch benannt, sollte ein indikator sein ob man bereits angemeldet ist.

clock_in und clock_out brauche ich später für die Webpage damit ich sehe wann ich angefangen habe und aufgehört... das mit dem Typ Date ist nur ein Test von mir im Moment noch, möchte die unterschiede sehen.

Ist ja alles am Anfang sowie meine Programmierkenntnisse auch :wink:

VG
Susie

Re: Fehler ValueError: too many values to unpack (expected 3) bei RFID Zeiterfassung

Verfasst: Montag 4. September 2023, 15:16
von __blackjack__
@Susie: Ob man bereits angemeldet ist, sieht man doch schon daran, dass es einen Eintrag gibt bei dem `clock_out` den Wert NULL hat. Dann ist das zusätzlich Flag redundant/überflüssig.

Edit: Das SQL sieht auch falsch aus. Da steht ein "=" an der Stelle wo eigentlich "WHERE" stehen sollte.