我正在为学校做一个项目并遇到一个十字路口。我在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 object is not subscriptable”。显然,没有匹配的行,因此NoneType错误。但是,它应该在上面的elif语句中重新提示用户。输入什么作为elif语句,以便重新提示用户输入有效的流派名称?注意:我现在已经注释掉了我的主要代码。
如果要专门检查SQL错误,可以为它们设置单独的except块。此外,通常(但并非总是)使用控制流异常是个坏主意。
下面的东西(我没有测试过)可能接近你需要的东西。
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)
祝你的项目好运。 :)