Ошибка IndexError: индекс кортежа вне диапазона подключения Python к PostgreSQL

#python #pandas #postgresql #dataframe

#python #pandas #postgresql #фрейм данных

Вопрос:

Я знаю, что этот вопрос задавался несколько раз, но я застрял здесь, не в состоянии продолжить. Я выполняю цикл for в python для загрузки данных в таблицу фактов.

Я выполняю приведенный ниже код

 for index, row in df.iterrows():

# get songid and artistid from song and artist tables
cur.execute(song_select, (row.song, row.artist, row.length))
results = cur.fetchone()

if results:
    song_id, artist_id = results
else:
    song_id, artist_id = None, None

# insert songplay record

songplay_data = (pd.to_datetime(row.ts, unit='ms'),row.userId,row.level,song_id,artist_id,row.sessionId,row.location,row.userAgent)
cur.execute(songplay_table_insert, songplay_data)
conn.commit()
 

и получение ошибки

 <ipython-input-22-b8b0e27022de> in <module>()
 13 
 14     songplay_data = (pd.to_datetime(row.ts, unit='ms'),row.userId,row.level,song_id,artist_id,row.sessionId,row.location,row.userAgent)
 15     cur.execute(songplay_table_insert, songplay_data)
 16     conn.commit()
 IndexError: tuple index out of range
 

Моя таблица, которую я пытаюсь вставить,

 songplay_table_insert = ("""INSERT INTO songplays (songplay_id, start_time, 
user_id, level, song_id, artist_id, session_id, location, user_agent )
VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s)
 

Я действительно застрял, любая помощь приветствуется.

Ответ №1:

У вас слишком много %s маркеров.

 VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s)
 

имеет 9 маркеров, в то время как

 songplay_data = (pd.to_datetime(row.ts, unit='ms'),row.userId,row.level,song_id,artist_id,row.sessionId,row.location,row.userAgent)
 

содержит 8 элементов. Когда он пытается вычислить последний маркер, он ищет 9-й элемент, т. Е. songplay_data[8] , и это вызывает ошибку.

Вам также нужно будет удалить songplay_id из SQL, чтобы сделать оператор INSERT действительным. База данных должна генерировать первичный ключ для вас, если у вас нет значения для предоставления, если нет, мы должны взглянуть на определение вашей таблицы.

Комментарии:

1. Спасибо, Алекс Холл. Я изменил инструкцию INSERT, и это сработало.