PostgreSQL данные объединены в Python словарях - PullRequest
0 голосов
/ 21 января 2020

Я использую 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 как словарь внутри словаря)?

...