Click here to Skip to main content
15,848,157 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I am currently facing an error especially when I run my flask .. The erro description is "AttributeError: 'tuple' object has no attribute 'values'"
The error points at line 11, and 331 which is defined in the function def course_options.
The error is found on this definition"options = [ tuple(course.values()) for course in courses]"

What I have tried:

Python
  1  from flask import render_template, url_for, flash, redirect, request
  2  from . import student_bp
  3  from app.student.forms import StudentForm, CollegeForm, CoursesForm, SearchStudentForm, SearchCourseForm, SearchCollegeForm
  4  from app import student,  mysql
  5  
  6  @student_bp.route('/')
  7  @student_bp.route('/view_students', methods=["POST", "GET"])
  8  def view_students():
  9  	form = StudentForm()
 10  	search_form = SearchStudentForm()
 11  	form.course_code.choices = course_options()
 12  	cur = mysql.connection.cursor()
 13  	cur.execute(''' SELECT * FROM student ''')
 14  	students_data = cur.fetchall()
 15  	return render_template('student/view_students.html', 
 16  							students_data=students_data,
 17  							search_form=search_form,
 18  							form=form)
 19  
 20  @student_bp.route('/view_courses', methods=["POST", "GET"])
 21  def view_courses():
 22  	form = CoursesForm()
 23  	search_form = SearchCourseForm()
 24  	cur = mysql.connection.cursor()
 25  	cur.execute(''' SELECT * FROM course ''')
 26  	courses_data = cur.fetchall()
 27  	form.college.choices = college_options()
 28  	return render_template('course/view_courses.html', 
 29  							courses_data=courses_data,
 30  							form=form,
 31  							search_form=search_form)
 32  
 33  @student_bp.route('/view_colleges', methods=["POST", "GET"])
 34  def view_colleges():
 35  	form = CollegeForm()
 36  	search_form = SearchCollegeForm()
 37  	cur = mysql.connection.cursor()
 38  	cur.execute(''' SELECT * FROM college ''')
 39  	colleges_data = cur.fetchall()
 40  	return render_template('college/view_colleges.html', 
 41  							colleges_data=colleges_data,
 42  							form=form,
 43  							search_form=search_form)
 44  
 45  
 46  @student_bp.route('/add_student',  methods=["POST", "GET"])
 47  
 48  def add_student():
 49  	form = StudentForm()
 50  	
 51  	
 52  	form.course.choices = course_options()
 53  	if form.validate_on_submit():
 54  		id_number = form.id_number.data
 55  		first_name = form.first_name.data
 56  		last_name = form.last_name.data
 57  		course_code = form.course_code.data
 58  		yr_level = form.year_level.data
 59  		gender = form.gender.data
 60  		cur = mysql.connection.cursor()
 61  		cur.execute(''' INSERT INTO student VALUES(%s,%s,%s,%s,%s,%s) ''',(id_number,first_name, last_name, course_code, yr_level, gender))
 62  		mysql.connection.commit()
 63  		flash("Student {} has been added, successfully!".format(id_number), "success")
 64  		return redirect(url_for('view_students'))
 65  		cur.close()
 66  	return render_template('student/view_students.html', title='Add Student', form=form)
 67  
 68  @student_bp.route('/add_course',  methods=["POST", "GET"])
 69  def add_course():
 70  	form = CoursesForm()
 71  	form.college.choices = college_options()
 72  	if form.validate_on_submit():
 73  		course_code = form.course_code.data
 74  		course_name = form.course_name.data
 75  		college_code = form.college_code.data
 76  		cur = mysql.connection.cursor()
 77  		cur.execute(''' INSERT INTO course VALUES(%s,%s,%s) ''',(course_code,course_name, college_code))
 78  		mysql.connection.commit()
 79  		flash("Course has been added, successfully!", "success")
 80  		return redirect(url_for('view_courses'))
 81  		cur.close()
 82  	return render_template('course/view_courses.html', title = 'Add Course', form = form)
 83  
 84  @student_bp.route('/add_college',  methods=["POST", "GET"])
 85  def add_college():
 86  	form = CollegeForm()
 87  	cur = mysql.connection.cursor()
 88  	if form.validate_on_submit():
 89  		college_code = form.college_code.data
 90  		college_name = form.college_name.data
 91  		cur = mysql.connection.cursor()
 92  		cur.execute(''' INSERT INTO college VALUES(%s,%s) ''',(college_code,college_name))
 93  		mysql.connection.commit()
 94  		flash("College has been added, successfully!", "success")
 95  		return redirect(url_for('view_colleges'))
 96  		cur.close()
 97  	return render_template('course/view_colleges.html', title = 'Add Course', form = form)
 98  
 99  
100  @student_bp.route('/edit_student/<id_number>',  methods=["POST", "GET"])
101  def edit_student(id_number):
102  	cursor = mysql.connection.cursor()
103  	cursor.execute(''' SELECT * FROM student WHERE school_id = %s ''', (id_number,))
104  	existing_data = cursor.fetchall()
105  	data = [tuple(data.values()) for data in existing_data]
106  	form = StudentForm()
107  	form.course_code.choices = course_options()
108  	if form.validate_on_submit():
109  		first_name = form.first_name.data
110  		last_name = form.last_name.data
111  		id_ = form.id_number.data
112  		course_code = form.course_code.data
113  		yr_level = form.year_level.data
114  		gender = form.gender.data
115  		cur = mysql.connection.cursor()
116  		cur.execute(''' UPDATE students SET school_id = %s,
117  											first_name = %s, 
118  											last_name = %s, 
119  											course_code = %s, 
120  											year = %s, 
121  											gender = %s 
122  										WHERE id_number = %s ''',(id_, first_name, last_name, course_code, yr_level, gender, id_number))
123  		mysql.connection.commit()
124  		flash("Student has been updated, successfully!", "success")
125  		return redirect(url_for('view_students'))
126  		cur.close()
127  
128  	elif request.method == "GET":
129  		form.id_number.data = data[0][0]
130  		form.first_name.data = data[0][1]
131  		form.last_name.data = data[0][2]
132  		form.course_code.data = data[0][3]
133  		form.year_level.data = data[0][4]
134  		form.gender.data = data[0][5]
135  		form.submit.label.text = "Update"
136  	return render_template('student/edit_student.html', 
137  							title = 'Update Student', 
138  							id_number=id_number,
139  							form=form)
140  
141  @student_bp.route('/edit_course/<course_code>',  methods=["POST", "GET"])
142  def edit_course(course_code):
143  	cursor = mysql.connection.cursor()
144  	cursor.execute(''' SELECT * FROM course WHERE course_code = %s ''', (course_code,))
145  	existing_data = cursor.fetchall()
146  	data = [tuple(data.values()) for data in existing_data]
147  	form = CoursesForm()
148  	form.college_code.choices = college_options()
149  	if form.validate_on_submit():
150  		course_code1=form.course_code.data
151  		course_name = form.course_name.data
152  		college_code = form.college_code.data
153  		cur = mysql.connection.cursor()
154  		cur.execute(''' UPDATE course SET name = %s, 
155  										  college_code = %s
156  										WHERE course_code = %s ''',( course_name, college_code, course_code1,))
157  		mysql.connection.commit()
158  		flash("Course has been updated, successfully!", "success")
159  		return redirect(url_for('view_courses'))
160  		cur.close()
161  
162  	elif request.method == "GET":
163  		form.course_code.data = data[0][0]
164  		form.course_name.data = data[0][1]
165  		form.college_code.data = data[0][2]
166  		form.submit.label.text = "Update"
167  	return render_template('course/edit_courses.html', 
168  							title = 'Update Student', 
169  							form = form)
170  
171  @student_bp.route('/edit_college/<college_code>',  methods=["POST", "GET"])
172  def edit_college(college_code):
173  	cursor = mysql.connection.cursor()
174  	cursor.execute(''' SELECT * FROM college WHERE college_code = %s ''', (college_code,))
175  	existing_data = cursor.fetchall()
176  	data = [tuple(data.values()) for data in existing_data]
177  	form = CollegeForm()
178  	if form.validate_on_submit():
179  		college_code1=form.college_code.data
180  		college_name = form.college_name.data
181  		cur = mysql.connection.cursor()
182  		cur.execute(''' UPDATE college SET name = %s 
183  										WHERE college_code = %s ''',( college_name, college_code1,))
184  		mysql.connection.commit()
185  		flash("College has been updated, successfully!", "success")
186  		return redirect(url_for('view_colleges'))
187  		cur.close()
188  
189  	elif request.method == "GET":
190  		form.college_code.data = data[0][0]
191  		form.college_name.data = data[0][1]
192  		form.submit.label.text = "Update"
193  	return render_template('college/edit_college.html', 
194  							title = 'Update College', 
195  							form = form)
196  
197  
198  @student_bp.route('/del_student/<id_number>', methods=["POST", "GET"])
199  def del_student(id_number):
200  	form = StudentForm()
201  	cursor = mysql.connection.cursor()
202  	cursor.execute("DELETE FROM student WHERE school_id = %s", (id_number,))
203  	cursor.close()
204  	mysql.connection.commit()
205  	flash("{}'s record has been deleted, successfully!".format(id_number), 
206            "danger")
207  	return redirect((url_for("view_students")))
208  
209  @student_bp.route('/del_course/<course_code>', methods=["POST", "GET"])
210  def del_course(course_code):
211  	cursor = mysql.connection.cursor()
212  	cursor.execute("DELETE FROM course WHERE course_code = %s", (course_code,))
213  	cursor.close()
214  	mysql.connection.commit()
215  	flash("{} course has been deleted, successfully!".format(course_code), 
216            "danger")
217  	return redirect((url_for("view_courses")))
218  
219  @student_bp.route('/del_college/<college_code>', methods=["POST", "GET"])
220  def del_college(college_code):
221  	cursor = mysql.connection.cursor()
222  	cursor.execute("DELETE FROM college WHERE college_code = %s", (college_code,))
223  	cursor.close()
224  	mysql.connection.commit()
225  	flash("College has been deleted, successfully!", 
226            "danger")
227  	return redirect((url_for("view_colleges")))
228  
229  
230  @student_bp.route('/student_search', methods=["POST", "GET"])
231  def student_search():
232  	search_form = SearchStudentForm()
233  	form = StudentForm()
234  	field = search_form.search_field.data
235  	searchby = search_form.search_by.data
236  	cursor = mysql.connection.cursor()
237  	if(searchby == 'all'):
238  		cursor.execute(''' SELECT * FROM student WHERE school_id REGEXP %s or 
239  														first_name REGEXP %s or 
240  														last_name REGEXP %s or 
241  														course_code REGEXP %s or
242  														year REGEXP %s or
243  														gender REGEXP %s ''', ([field], [field], [field], [field], [field], [field]))
244  		students_data = cursor.fetchall()
245  	if(searchby == 'school_id'):
246  		cursor.execute(''' SELECT * FROM students WHERE school_id REGEXP %s ''', [field])
247  		students_data = cursor.fetchall()
248  	if(searchby == 'first_name'):
249  		cursor.execute(''' SELECT * FROM students WHERE first_name REGEXP %s ''', [field])
250  		students_data = cursor.fetchall()
251  	if(searchby == 'last_name'):
252  		cursor.execute(''' SELECT * FROM students WHERE last_name REGEXP %s ''', [field])
253  		students_data = cursor.fetchall()
254  	if(searchby == 'course'):
255  		cursor.execute(''' SELECT * FROM students WHERE course REGEXP %s ''', [field])
256  		students_data = cursor.fetchall()
257  	if(searchby == 'year'):
258  		cursor.execute(''' SELECT * FROM students WHERE year REGEXP %s ''', [field])
259  		students_data = cursor.fetchall()
260  	if(searchby == 'gender'):
261  		cursor.execute(''' SELECT * FROM students WHERE gender REGEXP %s ''', [field])
262  		students_data = cursor.fetchall()
263  	flash("Search results for \" {} \"".format(field), 
264            "success")
265  	return render_template('student/view_students.html', 
266  							students_data=students_data,
267  							search_form=search_form,
268  							form=form,
269  							title='Search Results') 
270  
271  @student_bp.route('/course_search', methods=["POST", "GET"])
272  def course_search():
273  	search_form = SearchCourseForm()
274  	form = CoursesForm()
275  	field = search_form.search_field.data
276  	searchby = search_form.search_by.data
277  	cursor = mysql.connection.cursor()
278  	if(searchby == 'all'):
279  		cursor.execute(''' SELECT * FROM course WHERE course_code REGEXP %s or 
280  														name REGEXP %s or 
281  														college_code REGEXP %s ''', ([field], [field], [field]))
282  		courses_data = cursor.fetchall()
283  	if(searchby == 'course_code'):
284  		cursor.execute(''' SELECT * FROM course WHERE course_code REGEXP %s ''', [field])
285  		courses_data = cursor.fetchall()
286  	if(searchby == 'name'):
287  		cursor.execute(''' SELECT * FROM course WHERE name REGEXP %s ''', [field])
288  		courses_data = cursor.fetchall()
289  	if(searchby == 'college_code'):
290  		cursor.execute(''' SELECT * FROM course WHERE college_code REGEXP %s ''', [field])
291  		courses_data = cursor.fetchall()
292  	flash("Search results for \" {} \"".format(field), 
293            "success")
294  	return render_template('course/view_courses.html', 
295  							courses_data=courses_data,
296  							search_form=search_form,
297  							form=form,
298  							title='Search Results') 
299  
300  @student_bp.route('/college_search', methods=["POST", "GET"])
301  def college_search():
302  	search_form = SearchCollegeForm()
303  	form = CollegeForm()
304  	field = search_form.search_field.data
305  	searchby = search_form.search_by.data
306  	cursor = mysql.connection.cursor()
307  	if(searchby == 'all'):
308  		cursor.execute(''' SELECT * FROM college WHERE college_code REGEXP %s or 
309  														name REGEXP %s ''', ([field], [field]))
310  		colleges_data = cursor.fetchall()
311  	if(searchby == 'college_code'):
312  		cursor.execute(''' SELECT * FROM college WHERE college_code REGEXP %s ''', [field])
313  		colleges_data = cursor.fetchall()
314  	if(searchby == 'name'):
315  		cursor.execute(''' SELECT * FROM college WHERE name REGEXP %s ''', [field])
316  		colleges_data = cursor.fetchall()
317  	flash("Search results for \" {} \"".format(field), 
318            "success")
319  	return render_template('college/view_colleges.html', 
320  							colleges_data=colleges_data,
321  							search_form=search_form,
322  							form=form,
323  							title='Search Results') 
324  
325  
326  def course_options():
327  	cursor = mysql.connection.cursor()
328  	cursor.execute(''' SELECT course_code, name, college_code FROM course ''')
329  	courses = cursor.fetchall()
330  	
331  	options = [ tuple(course.values()) for course in courses]
332  
333  	
334  	return options
335  
336  def college_options():
337  	cursor = mysql.connection.cursor()
338  	cursor.execute(''' SELECT college_code, name FROM college ''')
339  	colleges = cursor.fetchall()
340  	options = [tuple(college.values()) for college in colleges]
341  	
342  	return options      
Posted
Updated 7-Nov-22 0:37am
v2
Comments
Richard MacCutchan 6-Nov-22 11:05am    
Where is line 11, or indeed 331; please provide proper details of your problem.

But either way the error message is clear. Whatever "tuple" is, it does not contain a "values" attribute,
Member 15021280 6-Nov-22 17:24pm    
@student_bp.route('/college_search', methods=["POST", "GET"])
def college_search():
search_form = SearchCollegeForm()
form = CollegeForm()
field = search_form.search_field.data
searchby = search_form.search_by.data
cursor = mysql.connection.cursor()
if(searchby == 'all'):
cursor.execute(''' SELECT * FROM college WHERE college_code REGEXP %s or
name REGEXP %s ''', ([field], [field]))
colleges_data = cursor.fetchall()
if(searchby == 'college_code'):
cursor.execute(''' SELECT * FROM college WHERE college_code REGEXP %s ''', [field])
colleges_data = cursor.fetchall()
if(searchby == 'name'):
cursor.execute(''' SELECT * FROM college WHERE name REGEXP %s ''', [field])
colleges_data = cursor.fetchall()
flash("Search results for \" {} \"".format(field),
"success")
return render_template('college/view_colleges.html',
colleges_data=colleges_data,
search_form=search_form,
form=form,
title='Search Results')


def course_options():
cursor = mysql.connection.cursor()
cursor.execute(''' SELECT course_code, name, college_code FROM course ''')
courses = cursor.fetchall()

options = [ tuple(course.values()) for course in courses]


return options

def college_options():
cursor = mysql.connection.cursor()
cursor.execute(''' SELECT college_code, name FROM college ''')
colleges = cursor.fetchall()
options = [tuple(college.values()) for college in colleges]

return options
Member 15021280 6-Nov-22 17:24pm    
def course_options():
cursor = mysql.connection.cursor()
cursor.execute(''' SELECT course_code, name, college_code FROM course ''')
courses = cursor.fetchall()

options = [ tuple(course.values()) for course in courses]


return options

def college_options():
cursor = mysql.connection.cursor()
cursor.execute(''' SELECT college_code, name FROM college ''')
colleges = cursor.fetchall()
options = [tuple(college.values()) for college in colleges]

return options
Sandeep Mewara 7-Nov-22 6:18am    
Not sure of your data structure, nor on how you plan to use 'options'.

Tuple doesn't have value attribute.

// If you want to use list form of returned tuple list
data = cursor.fetchall()
data = list(data)

// Based on index
// If result is ((123,), (234,), (345,)):
row = [item[0] for item in cursor.fetchall()]
//row
//[123, 234, 345]

1 solution

Python
329  	courses = cursor.fetchall()
330  	
331  	options = [ tuple(course.values()) for course in courses]

The fetchall method returns an array of rows, and each row is a tuple of the columns read from the database. So the expression course.values() on line 331, is trying to call the values method of a tuple object named course. And as can be seen in Built-in Types — Python 3.11.0 documentation[^], there is no such method.

But since course is already a tuple you can just write:
Python
options = [ course for course in courses]

or even:
Python
options = cursor.fetchall()

And that will give a list of tuples, which may, or may not, be what you want.
 
Share this answer
 
v2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900