Как проверить ошибку функции, содержащей запрос SQL с заполнителем% s - PullRequest
0 голосов
/ 08 апреля 2019

Я работаю над проектом для школы и сталкиваюсь с перекрестком. У меня есть несколько запросов в скрипте Python, которые пользователь может искать при запуске скрипта. Несколько из этих функций используют% s в качестве заполнителя, чтобы пользователь мог ввести значение.

Однако я хочу проверить, что то, что они вводят, действительно находится в моей базе данных. Например, если вы спросите пользователя о жанре фильма, он должен выдать ошибку, если он введет что-то, чего нет в моих таблицах.

Я потратил несколько дней, пытаясь найти способ сделать это, но без удачи. Я не самый лучший с функциями, и я иногда путаюсь.

Для упрощения я скопировал один из моих запросов, требующих ввода данных пользователем для тестирования. Я думал, что нашел решение о том, как проверить ошибки, но не повезло. Я вставил код ниже. Если вы знаете, чего мне не хватает, ваша помощь будет высоко оценена.

#!/usr/bin/python36

#Modules
############################
import psycopg2
import sys
import os

#Open Database
############################
global cursor

#def OpenDatabase():
try:
        connection = psycopg2.connect(database='Blockbuster36', user='dbadmin')
        cursor = connection.cursor()
except psycopg2.DatabaseError:
        print("No connection to database.")
        sys.exit(1)

#Functions
###########################
def Show_Tuples():
        tuple = cursor.fetchone()
        while tuple != None:
                print(tuple)
                tuple = cursor.fetchone()

#3) Display all films of a certain genre
def Qry3_Film_of_Genre(Genre_Choice):
        Qry3 = '''select Film_Title, Genre_Name from Film 
                join Film_Genre 
                on Film.Film_ID = Film_Genre.Film_ID 
                join Genre 
                on Film_Genre.Genre_ID = Genre.Genre_ID 
                where Genre_Name = %s;'''

        cursor.execute(Qry3, (Genre_Choice,))
        Show_Tuples()

def Qry3_Error_Check(Genre_Choice):
        try:
                Qry3_ec = "select Genre_ID, Genre_Name from Genre where Genre_Name = %s;"
                cursor.execute(Qry3_ec, (Genre_Choice,))
                results = cursor.fetchone()
                if results[0] > 0:
                        print()
                        Qry3_Film_of_Genre(Genre_Choice)
#               else:
                elif results[0] == None:
                        print("This Genre does not exist")
                        Genre_Choice = input("Please enter the Genre name to filter movies by: ")
        except psycopg2.Error as query_issue:
                print("Something wrong with the query", query_issue)
        except Exception as unkown:
                print("Error: Something else went wrong")
                print("Here is the issue: ", unkown)

#Main Code
##########################
Genre_Choice = input("Please enter the Genre name to filter movies by: ")
Check_Genre = Qry3_Error_Check(Genre_Choice)
#print("Function Return: ", Check_Genre)
#print()

#print(Check_Genre)
#if Check_Genre == None:
#       print("This Genre does not exist")
#       Genre_Choice = input("Please enter the Genre name to filter movies by: ")
#       Check_Genre = Qry3_Error_Check(Genre_Choice)
#elif Check_Genre != None:
#       Qry3_Film_of_Genre(Genre_Choice)

#while Check_Genre != Genre_Choice:
#       print("This Genre does not exist")
#       Genre_Choice = input("Please enter the Genre name to filter movies by: ")
#       Check_Genre = Qry3_Error_Check(Genre_Choice)
#if Check_Genre == None:
#       Qry3_Film_of_Genre(Genre_Choice)

#Close Cursor and Database
###################################
cursor.close()
connection.close()

По сути, я хочу, чтобы сообщение об ошибке продолжало печататься вместе с вводом названия другого жанра, пока не будет введен правильный жанр. Сейчас он продолжает говорить, что это неправильно, даже если ввести правильное название жанра и получить вывод с помощью функции Qry3_Error_Check.

Как только пользователь введет правильное название жанра на основе запроса функции проверки ошибок, появится исходный запрос.


Я добился определенного прогресса, ввод действующего жанра теперь работает. Однако при вводе недопустимого названия жанра он переходит к общему, за исключением того, что выдает ошибку «Объект NoneType не может быть подписан». Очевидно, что нет соответствующих строк, таким образом, ошибка NoneType. Тем не менее, он должен повторно запросить пользователя в заявлении elif выше. Что вводить в качестве оператора elif, чтобы пользователю повторно предлагалось ввести действительное название жанра? Примечание. На данный момент я закомментировал основную часть своего основного кода.

1 Ответ

0 голосов
/ 08 апреля 2019

Если вы хотите специально проверять ошибки SQL, у вас может быть отдельный блок кроме них.Кроме того, обычно (но не всегда) плохая идея использовать исключения для потока управления.

Что-то вроде ниже (я не проверял это), вероятно, близко к тому, что вам нужно.

try:
    Qry3_ec = "select Genre_ID, Genre_Name from Genre where Genre_Name = %s;"
    cursor.execute(Qry3_ec, (Genre_Choice,))
    results = cursor.fetchall()
    if results.count > 0:
        print(results)
    else:
        print("Nothing found!")
except psycopg2.Error as e:
    print("Something wrong with the query")
    print(e)
except Exception as e
    print("Something else went wrong")
    print(e)

Удачи в вашем проекте.:)

...