IndexError:元组索引超出范围,将Python连接到PostgreSQL

时间:2019-04-14 19:06:30

标签: python pandas postgresql dataframe

我知道这个问题已经问过很多次了,但是我被困在这里无法继续进行。我正在python中执行for循环,以将数据加载到事实表。

我正在执行以下代码

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 个答案:

答案 0 :(得分: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],这会引起错误。

您还需要从SQL中删除songplay_id,以使INSERT语句有效。如果您没有要提供的值,那么数据库应该为您生成主键,否则,我们应该查看您的表定义。