我想使用pylast接口将last.fm的用户最近的音乐曲目列表保存到postgresql数据库表。但是当我尝试向表中插入值时,它显示了errors.Code示例:
import pylast
import psycopg2
import re
from md5 import md5
import sys
import codecs
import psycopg2.extensions
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
user_name = raw_input("Enter last.fm username: ")
user_password = raw_input("Enter last.fm password: ")
api_key = '*********'
api_secret = '********'
#Lastfm network authentication
md5_user_password = md5(user_password).hexdigest()
network = pylast.get_lastfm_network(api_key, api_secret,user_name,md5_user_password)
used=pylast.User(user_name, network)
recent_tracks=used.get_recent_tracks(10)
# Database connection
try:
conn=psycopg2.connect("dbname='**' user='postgres' host='localhost' password='*'")
conn.set_client_encoding('UNICODE')
except:
print "I am unable to connect to the database, exiting."
sys.exit()
cur=conn.cursor()
for i, artist in enumerate(recent_tracks):
for key in sorted(artist):
cur.execute("""
INSERT INTO u_recent_track(Playback_date,Time_stamp,Track)
VALUES (%s,%s,%s)""", (key, artist[key]))
conn.commit()
cur.execute("SELECT * FROM u_recent_track;")
cur.fetchone()
for row in cur:
print ' '.join(row[1:])
cur.close()
conn.close()
这里“recent_tracks”元组的值为例如:
artist 0
- playback_date : 5 May 2010, 11:14
- timestamp : 1273058099
- track : Brian Eno - Web
我想将这些值存储在u_recent_track(Tid,Playback_date,Time_stamp,Track)下。任何人都知道如何解决这个问题?当我试图运行时,它显示错误:
Traceback (most recent call last):
File "F:\JavaWorkspace\Test\src\recent_track_database.py", line 50, in <module>
VALUES (%s,%s,%s)""", (key, artist[key]))
IndexError: tuple index out of range
答案 0 :(得分:1)
sorted(artist)
会返回艺术家的有序列表,当您对其进行迭代时,它会返回artist
的元素。因此,当您尝试访问artist[key]
时,它实际上是在尝试访问由索引编制索引的artist
元素,该元素是artist
本身的元素。元组不会这样工作。
您似乎正在使用python2.5或更低版本,因此您可以这样做:
cur.executemany("""
INSERT INTO u_recent_track(Playback_date,Time_stamp,Track)
VALUES (%(playback_date)s,%(timestamp)s,%(track)s)""", recent_tracks)
conn.commit()
这应该有用。
答案 1 :(得分:0)
(Playback_date,Time_stamp,Track)
表示您要将三个值插入一行。
因此,VALUES (%s,%s)
应为VALUES (%s,%s,%s)
(key, artist[key])
应该是一个包含3个元素的元组,而不是2个元素。
尝试:
for track in recent_tracks:
cur.execute("""
INSERT INTO u_recent_track(Playback_date,Time_stamp,Track)
VALUES (%s,%s,%s)""", (track.get_date(), track.get_timestamp(), track.get_track()))
conn.commit()
PS。 This is where我正在获取有关pylast API的信息。
PPS。如果我对文档的阅读是正确的,track.get_track()
将返回Track
个对象。它有get_album
,get_artist
,get_id
和get_title
等方法。您希望将哪些内容存储在Track
数据库表的u_recent_track
列中?
答案 2 :(得分:0)
此错误与Postgres没有任何关系,但与artist
变量有关。你是先说:
for key in sorted(artist):
暗示它是一个列表,但是你正在访问它,好像它是一个字典,这引起了一个错误。这是什么?你能展示一个完整内容的例子吗?