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

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Susie
User
Beiträge: 6
Registriert: Mittwoch 28. September 2022, 18:01

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
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte die vollstaendige Fehlermeldung posten, und nicht eine reduzierte Version, an der man die Code-Stelle nicht erkennen kann.
Susie
User
Beiträge: 6
Registriert: Mittwoch 28. September 2022, 18:01

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)
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
Susie
User
Beiträge: 6
Registriert: Mittwoch 28. September 2022, 18:01

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
Susie
User
Beiträge: 6
Registriert: Mittwoch 28. September 2022, 18:01

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
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten