TypeError: Argument vom Typ „NoneType“ kann beim Abrufen aus der Datenbank nicht iteriert werden
Posted: 03 Jan 2025, 17:57
Ich erstelle eine App mit einer Flask-basierten API und einer PostgreSQL-Datenbank. Ein großer Teil des Projekts ist ein Empfehlungsalgorithmus, der Daten dynamisch aus der Datenbank abruft und in Pandas DataFrames verarbeitet. Wenn ich versuche, auf http://127.0.0.1:5000/recomender/1 zuzugreifen, um Empfehlungen für den Benutzer mit student_id = 1 zu erhalten, erhalte ich die Fehlermeldung:
[/b]
Dieser Fehler ist unerwartet, da die Datenbank gültige Daten für student_id = 1 enthält. Hier ist ein Ausdruck der abgerufenen Daten (mit psycopg2 und RealDictRow):[/b] Während einige Felder mit „Keine“ gefüllt sind, sollten sie sich überhaupt nicht auf das Erhalten einer Empfehlung auswirken, der Code zum Erhalten von Empfehlungen benötigt sie jedoch nicht:
und
und ich rufe Schüler- und Aktivitätsdaten dynamisch ab
Ich füge die Informationen übrigens in einen Pandas-Datenrahmen ein.
Ich hatte den gleichen Fehler http://127.0.0.1:5000/ recomender/7 (Empfehlungen für den Benutzer mit dem Studentenausweis 7 erhalten) und ich habe das Problem behoben, indem ich das Interesse geändert habe, das zunächst das Lesen von Daten hatte[/b] und ich haben das Interesse in der Datenbank auf Wissenschaft und Technologie geändert. Ich habe die gleiche Änderung mit student_id:1 vorgenommen und es hat immer noch nicht funktioniert. Ich habe verschiedene Änderungen an den Interessen versucht, die mit den Interessen einiger anderer Daten übereinstimmen, und habe trotzdem den Fehler erhalten. Zu den weiteren Entitäten, die funktioniert haben, gehören: [/b] und [/b]
Code: Select all
TypeError: argument of type 'NoneType' is not iterable
Dieser Fehler ist unerwartet, da die Datenbank gültige Daten für student_id = 1 enthält. Hier ist ein Ausdruck der abgerufenen Daten (mit psycopg2 und RealDictRow):
Code: Select all
RealDictRow([('name', 'Jane Doe'), ('student_id', 1), ('email', 'jane.doe@example.com'), ('phone', '123-456-7890'), ('grade', 'junior'), ('race', 'hispanic'), ('birthday', datetime.date(2006, 5, 15)), ('gender', 'female'), ('income', 'middle'), ('creeated_at', datetime.datetime(2024, 6, 27, 1, 25, 15, 235039)), ('intended_major', 'COMPUTER SCIENCE'), ('interest', ['Science', 'technology']), ('gpa', None), ('hashed_password', None), ('username', None)])
Code: Select all
def calculate_matching(student_interest, student_grade, student_intended_major, opprtunity_tags):
score = 0
for tag in opprtunity_tags:
if tag in student_interest:
score += 2
if tag in student_grade:
score += 1
if tag in student_intended_major:
score += 3
return score
Code: Select all
@app.route('/recomender/')
def createRecomendations(student_id):
# Dynamically fetch the latest student data from the database
students_df = get_students_df()
opportunities_df = get_opportunities_df()
# Ensure the student exists in the dataframe
if student_id not in students_df.index:
return {'error': 'Student not found'}, 404
# Get the student's information
recstudent = students_df.loc[students_df.index == student_id].iloc[0]
student_interest = recstudent['interest']
student_grade = recstudent['grade']
student_intended_major = recstudent['intended_major']
match_scores = []
for ind, row in opportunities_df.iterrows():
opportunity_tags = row['tags']
match_score = calculate_matching(student_interest, student_grade, student_intended_major, opportunity_tags)
# Update the DataFrame with the match score
opportunities_df.at[ind, 'match_score'] = match_score
match_scores.append({'opportunity': row['title'], 'match_score': match_score})
print(student_interest)
print(match_scores)
return {'recommendations': match_scores}
Code: Select all
def get_students_df():
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute('SELECT * FROM students')
students = cursor.fetchall()
cursor.close()
conn.close()
print(students)
return pd.DataFrame(students)
def get_opportunities_df():
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute('SELECT * FROM oppertunities')
opportunites = cursor.fetchall()
cursor.close()
conn.close()
return pd.DataFrame(opportunites)
Ich hatte den gleichen Fehler http://127.0.0.1:5000/ recomender/7 (Empfehlungen für den Benutzer mit dem Studentenausweis 7 erhalten) und ich habe das Problem behoben, indem ich das Interesse geändert habe, das zunächst das Lesen von Daten hatte
Code: Select all
RealDictRow([('name', 'algo rithim'), ('student_id', 7), ('email', 'algo@rithim.com'), ('phone', '123-456-9901'), ('grade', 'junior'), ('race', 'black'), ('birthday', datetime.date(2005, 6, 15)), ('gender', 'male'), ('income', 'middle'), ('creeated_at', datetime.datetime(2024, 6, 27, 11, 41, 1, 27045)), ('intended_major', 'BIOLOGY'), ('interest', ['science', 'research']), ('gpa', 3), ('hashed_password', None), ('username', None)])
Code: Select all
[RealDictRow([('name', 'Johnny Doe'), ('student_id', 5), ('email', 'john.do2@example.com'), ('phone', '123-456-7840'), ('grade', 'junior'), ('race', 'white'), ('birthday', datetime.date(2005, 6, 15)), ('gender', 'male'), ('income', 'middle'), ('creeated_at', datetime.datetime(2024, 6, 27, 4, 59, 29, 242410)), ('intended_major', 'MASS MEDIA'), ('interest', None), ('gpa', None), ('hashed_password', None), ('username', None)])
Code: Select all
RealDictRow([('name', 'Testuser'), ('student_id', 21), ('email', 'Testuser@testmail.com'), ('phone', '(912) 134-3553'), ('grade', 'junior'), ('race', 'black'), ('birthday', datetime.date(2006, 1, 14)), ('gender', 'male'), ('income', None), ('creeated_at', datetime.datetime(2024, 12, 4, 13, 46, 23, 364021)), ('intended_major', 'VISUAL AND PERFORMING ARTS'), ('interest', ['Science', 'Computers', 'Technology', 'Male Identifying', 'College Prep', 'Business', 'Chemistry', 'Space Exploration', 'Social Justice', 'Psychology', 'U.S. History', 'World History']), ('gpa', None), ('hashed_password', '$2b$12$cz5M9yuK.9ILN431TPQ51ul46a3sCDCOCLxZXX6TF8P4yV5S.7dZy'), ('username', None)]),