Я использую array_agg в одном из моих запросов Postgresql в Python с использованием psycopg2.
Проблема, которую я нахожу, заключается в циклическом прохождении результирующих строк. Сгенерированный столбец из запроса не понимает, что один столбец является списком списков. Вместо этого он думает, что это список стр.
Вот пример базы данных:
+---------+-------------+-----------------+
| student | grade_value | grade_comment |
+---------+-------------+-----------------+
| Paul | 1 | Very good |
| John | 1 | Very good |
| John | 2 | Average |
| Mark | 1 | Very good |
| Mark | 3 | Could do better |
| Mark | 1 | Very good |
+---------+-------------+-----------------+
Запрос, который я делаю:
connection = psycopg2.connect(ls.CONNECTION_STRING)
cursor = connection.cursor(cursor_factory=RealDictCursor)
cursor.execute(
"SELECT student, array_agg('(' || grade_value || ',' || grade_comment || ')') as grades"
"FROM random_table"
"GROUP BY student"
)
students_grades = cursor.fetchall()
# This returns something like: RealDictRow([('student', John), ('grades', ['(1,Very good)', '(2,Average)'])]), RealDictRow([('student', Paul), ('grades', ['(1,Very good)'])])
for student in students_grades:
for grade in student['grades']:
print(grade)
print(type(grade))
Значенияof print (grade) в конце имеют такой формат: (1, Very good) Но запрос говорит, что тип является строкой. В результате я не могу получить доступ к комментарию оценки, просто набрав оценку [1]. Он считает, что оценка - это строка.
Не могли бы вы знать, как это исправить?