Я использую PostgreSQL в качестве базы данных и импортирую psycopg2 в Python. У меня есть база данных с отношением «многие ко многим» между тремя таблицами. У меня есть фильмы таблица ( movie_id, имя, год ), таблица актеров ( actor_id, фамилия, имя_первой, actor_ordinal ), и третья промежуточная таблица ctors_movies ( actor_id, movie_id ) внешних ключей для соединения двух, с (actor_id, movie_id) , сделанным первичным ключом.
Теперь у меня есть следующие данные в таблицах:
фильмы
movie_id name year
139 Titanic 1997
140 The Matrix 1999
актеры
actor_id last_name first_name actor_ordinal
203 DiCaprio Leonardo 1
204 Winslet Kate 2
205 Reaves Keanu 1
ctors_movies (промежуточная таблица):
actor_id movie_id
203 139
204 139
205 140
Мне нужно собрать данные для представления кредитов mov ie в виде двух отдельных строк: одна для Titani c и один для Матрица путем извлечения данных из базы данных.
Для этого я пытаюсь создать словари. Используя psycopg2 в Python, я запускаю следующий код с RealDictCursor:
def retrieve_data():
connection = psycopg2.connect(user='postgres', password='postgres', database='movie')
cursor = connection.cursor(cursor_factory = psycopg2.extras.RealDictCursor)
query1 = 'SELECT * FROM movies LEFT JOIN actors_movies on movies.movie_id = actors_movies.movie_id LEFT JOIN actors on actors.actor_id = actors_movies.actor_id'
cursor.execute(query1)
movies = cursor.fetchall()
for row in movies:
print(row)
retrieve_data()
Он создает три отдельных словаря:
RealDictRow([('movie_id', 139), ('name', 'Titanic'), ('year', 1997), ('actor_id', 203), ('last_name', 'DiCaprio'), ('first_name', 'Leonardo'), ('actor_ordinal', 1)])
RealDictRow([('movie_id', 139), ('name', 'Titanic'), ('year', 1997), ('actor_id', 204), ('last_name', 'Winslet'), ('first_name', 'Kate'), ('actor_ordinal', 2)])
RealDictRow([('movie_id', 140), ('name', 'The Matrix'), ('year', 1999), ('actor_id', 205), ('last_name', 'Reaves'), ('first_name', 'Keanu'), ('actor_ordinal', 1)])
Из этих данных я не могу представить два фильма, так как три словаря вместо двух.
Вопрос в том, как объединить первые два словаря в один словарь с помощью одного и того же movie_id, составив в нем список актеров ( DiCaprio и Winslet как словарь внутри словаря)?