Получение ошибки при вставке значений кортежа в таблицу postgreSQL с использованием python - PullRequest
0 голосов
/ 06 мая 2010

Я хочу сохранить список последних музыкальных треков пользователя last.fm в таблице базы данных postgresql, используя интерфейс pylast. Но когда я пытался вставить значения в таблицу, она показывает ошибки. Пример кода:

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

Ответы [ 3 ]

1 голос
/ 06 мая 2010

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()

Это должно сработать.

0 голосов
/ 06 мая 2010

Эта ошибка связана не с Postgres, а с переменной artist.Сначала вы говорите:

for key in sorted(artist):

, подразумевая, что это список, но затем вы получаете к нему доступ как к словарю, что вызывает ошибку.Что он?Можете ли вы показать пример полного содержания?

0 голосов
/ 06 мая 2010

(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. Здесь я получаю информацию об API pylast.

PPS. Если мое прочтение документации правильное, track.get_track() вернет объект Track. У него есть такие методы, как get_album, get_artist, get_id и get_title. Что именно вы хотите сохранить в столбце Track таблицы базы данных u_recent_track?

...