cursor.fetchall () возвращает только одну строку в Python с PostgreSQL - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь создать учебное приложение в python для работы с базой данных фильмов, добавляя детали mov ie через текстовое меню, запрашивая ввод данных для всех полей (mov ie name, актеры, компания, и др c.). Я использую PostgreSQL в качестве базы данных и импортирую psycopg2 в Python.

Исходя из пользовательского ввода, я собираю данные, которые затем хочу сохранить в своих таблицах базы данных 'movies' и 'актеры' . На один мов ie приходится несколько актеров. У меня есть этот код:

def insert_movie(name, actors, company, year):
    connection = psycopg2.connect(user='postgres', password='postgres', database='movie')
    cursor = connection.cursor()

    query1 = "INSERT INTO movies (name, company, year) VALUES (%s, %s, %s);"
    cursor.execute(query1, (name, company, year))
    movie_id = cursor.fetchone[0]
    print(movie_id)
    query2 = 'INSERT INTO actors (last_name, first_name, actor_ordinal) VALUES (%s, %s, %s);'
    for actor in actors:
        cursor.execute(query2, (tuple(actor)))
    rows = cursor.fetchall()
    actor_id1 = [row[0] for row in rows]
    actor_id2 = [row[1] for row in rows]
    print(actor_id1)
    print(actor_id2)

    connection.commit()
    connection.close()

Это прекрасно работает для печати movie_id после query1 . Однако для печати actor_id2 я получаю IndexError: список индекса выходит за пределы диапазона .

Если я оставлю только actor_id1 в query3 вот так:

query2 = 'INSERT INTO actors (last_name, first_name, actor_ordinal) VALUES (%s, %s, %s);'
for actor in actors:
    cursor.execute(query2, (tuple(actor)))
rows = cursor.fetchall()
actor_id1 = [row[0] for row in rows]
print(actor_id1)

, мне распечатывается следующий результат:

movie_id --> 112
actor2_id --> 155

Проблема, которую я не могу получить actor1_id с этим кодом, который 154 .

Кто-нибудь может помочь с использованием fetchall правильно здесь?

1 Ответ

1 голос
/ 21 января 2020

ОК, я нашел ответ. fetch следует использовать внутри l oop, так как мы должны выполнить fetch для каждой строки, а не после полного запроса для всех строк:

query2 = 'INSERT INTO actors (last_name, first_name, actor_ordinal) VALUES (%s, %s, %s);'
actor_ids = []
for actor in actors:
    cursor.execute(query2, (tuple(actor)))
    actor_id = cursor.fetchone()[0]
    actor_ids.append(actor_id)
print(actor_ids)
...