#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, и это сработало.