我知道这个问题已经问过很多次了,但是我被困在这里无法继续进行。我正在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)
我真的很受困扰,不胜感激。
答案 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语句有效。如果您没有要提供的值,那么数据库应该为您生成主键,否则,我们应该查看您的表定义。