2

編集:回答:「einlesen()」関数用に別のカーソルを作成する必要がありました。

PythonでSQLite3を使用するのはこれが初めてなので、(恐らく)恐ろしい構文を許してください;)必要な情報(俳優など)をAmazonから直接フェッチする一種のDVDデータベースを構築しようとしています。プログラム全体はSQLite3とPython2.7に基づいています。

私のplannesの「更新」機能を除いて、すべてがうまく機能します。

def update():
    print 'Update Datenbank....bitte warten....'
    cursor.execute('''SELECT titel, amazon, erhalten, ausgeliehen FROM movies''')
    antwort = 'update'
    for row in cursor:
        stelle = row[1]
        ausg = row[2]
        erh = row[3]
        einlesen(stelle, ausg, erh, antwort)
        print row[0]
    raw_input('Update komplett!')
    menu()

問題は、ループが1回の反復後に終了することです。

出力は次のようになります。

Update Datenbank....bitte warten....
#a few seconds pass
The Day After Tommorrow
Update komplett!

ループと関数呼び出しは正しいですが(データベースは正しく更新されます-関数'einlesen()'によって実行されます)、1つだけではなく、さらに多くの反復があります...だから私の質問は:何が間違っているのか?;)

(省略形の)'einlesen()'関数は次のとおりです。

def einlesen(asin, ausg, erh, antwort):
    d = {}
    infos = urllib.urlopen('http://www.amazon.de/dp/'+asin).read()
    titel = infos[infos.find('Kaufen Sie')+11:infos.find('nstig ein')-3]
    art = 'dvd'
    infos = remove_html_tags(infos)
    infos = infos[infos.find('Darsteller: '):infos.find('Durchschnittliche')]
    infos = infos.split('\n')
    for x in range(200):
        try:
            infos.remove('')
        except:
            break
    for element in infos:
            d[element.split(': ')[0].lstrip()] = element.split(': ')[1]

#(excluded the whole Info-Scraping process)

    if antwort == 'update':
        movie = dauer, art, regie, jahr, fsk, darsteller, titel
        sql = ('''UPDATE movies SET laufzeit = ?, art = ?, regie = ?, jahr = ?, fsk =     ?, darsteller = ? WHERE titel = ?''')
        cursor.execute(sql, movie)
        connection.commit()
    else:
        menu()

ご協力いただきありがとうございます。

4

1 に答える 1

3

UPDATEの結果をループしている間に実行しますSELECT。これにより、最初のの結果が削除されcursor.execute()ます。

2番目のカーソルを使用します。

編集:

cur1 = con.cursor()
cur2 = con.cursor()

cur1.execute("SELECT ...")
for row in cur1:
    cur2.execute("UPDATE ...")
于 2012-09-04T07:55:00.837 に答える