MYSQL Abfragen in Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
panni2000
User
Beiträge: 1
Registriert: Freitag 20. Mai 2022, 14:27

Guten Tag,

ich habe eine Frage: meine if Abfragen werden nicht berücksichtig, sondern einfach übersprungen. Auch wenn question= 1 TRUE ist, werden die weiteren inputs für name, genre usw. nicht aufgerufen, sondern es springt direkt zum Ende. Wisst ihr wo mein Fehler ist? Ohne if questions funktioniert alles einwandfrei. Ich möchte nur ein Auswahlmenu erstellen, damit der Enduser eine Wahl hat.

Code: Alles auswählen

 import mysql.connector

mydb = mysql.connector.connect(
        host="localhost",
        user="root",
        passwd="",
        database="valorant"
        )

mycursor = mydb.cursor()
question= input("enter 1. to make an entry \nenter 2. if you would like to select every \nenter 3. to drop the table ")
if question==1:

    name=                    input("enter the name of your game: ")
    genre=                   input("enter the genre of your game: ")
    release_date=            input("enter a date in YYYY-MM-DD format: ")
    description=             input("enter a game description ")
                               
    insertSQL= 'INSERT INTO games (name, genre, release_Datum, description) VALUES (%s, %s, %s, %s)'

    game = (name, genre, release_date,description)  #construct the entry for your table
    mycursor.execute(insertSQL, game)               #first value is my table, second value my entry
    #mycursor.executemany(insertSQL, game)          #to insert arrays     

elif question ==2:
    mycursor.execute ("SELECT * FROM games")
    for x in mycursor:
        print(x)
        
    mydb.commit()                                   #to save changes in your table


elif question ==3:
    mycursor.execute ("DROP TABLE games")


 
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Drop table ist schon ein recht hartes kommando, wuerde ich nicht anbieten.

Wie dem auch sein, dein Problem ist ganz einfach: du bekommst eine Eingabe in Form eines Strings. Du vergleichst mit einer Ganzzahl. Das geht in die Hose. Wahlweise musst du deine eingabe in eine Zahl wandeln, also zb mit int(eingabe), oder du vergleichst eben auf "1" etc.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@panni2000: Ergänzend zu __deets__: DROP TABLE ist auch komisch weil es keine Möglichkeit gibt wieder eine Tabelle zu erstellen. Das löschen von einzelnen Einträgen fehlt irgendwie, und als umfassendere Massnahme statt die Tabelle zu löschen, deren *Inhalt* zu löschen.

Sonstige Anmerkungen: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Der Präfix `my` ist nutzlos, weil das dem Leser keinen Mehrwert liefert. Das gilt auch für Kommentare die das offensichtliche, was da schon als Code steht, noch mal aussagen. Wobei in der Regel offensichtlich ist was in der Dokumentation zu Sprache und Bibliotheken steht. Was noch schlechter ist, sind Kommentare die nicht stimmen. Wie dass der erste Wert beim `execute()`-Aufruf die Tabelle sei. Oder das `executemany()` für Arrays ist. Arrays sind etwas anderes als Listen. Und `executemany()` kann man letztlich jedes iterierbare Objekt geben das entsprechende Werte liefert.

Sowohl die Datenbankverbindung als auch `Cursor`-Objekte sollte man nach Gebrauch schliessen.

Um binäre Operatoren und das ``=`` bei Zuweisungen ausserhalb von Argumentlisten erhöhen Leerzeichen die Lesbarkeit. Vor Klammern von Aufrufen gehört dagegen kein Leerzeichen.

Dar Name `question` ist inhaltlich falsch denn der Wert repräsentiert ja nicht die Frage, sondern die Antwort des Benutzers.

`Cursor`-Objekte sind eher etwas kurzlebiges das man pro Aufgabe erstellt, und vielleicht auch nur wenn tatsächlich ein `Cursor` gebraucht wird.

`x` ist kein guter Name für einen Datensatz der ein Spiel repräsentiert.

Eine Falscheingabe vom Benutzer sollte nicht einfach lautlos durchgehen. Wenn man ``if`` und ``elif`` hat, will man in der Regel auch ein ``else`` am Ende um auf den Fall zu reagieren in dem keine Bedingung zutrifft.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from contextlib import closing

import mysql.connector


def main():
    with closing(
        mysql.connector.connect(
            host="localhost", user="root", passwd="", database="valorant"
        )
    ) as database:
        answer = input(
            "enter 1. to make an entry\n"
            "enter 2. if you would like to select every\n"
            "enter 3. to drop the table\n"
            "> "
        )
        if answer == "1":
            with closing(database.cursor()) as cursor:
                cursor.execute(
                    (
                        "INSERT INTO games (name, genre, release_date, description)"
                        " VALUES (%s, %s, %s, %s)"
                    ),
                    [
                        input(f"Enter the {text}: ")
                        for text in [
                            "name of your game",
                            "genre of your game",
                            "release date in YYYY-MM-DD format",
                            "game description",
                        ]
                    ],
                )

        elif answer == "2":
            with closing(database.cursor()) as cursor:
                cursor.execute("SELECT * FROM games")
                for game in cursor:
                    print(game)

        elif answer == "3":
            with closing(database.cursor()) as cursor:
                cursor.execute("DROP TABLE games")

        else:
            print(f"Don't know what to do with {answer!r}.")


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten