2012-09-04 57 views
2

编辑: 回答:我需要为'einlesen()'函数创建另一个游标。我想第一次在Python中使用SQLite3,所以请原谅我的(也许)可怕的语法;) 我试图建立一种DVD数据库,从亚马逊直接获取必要的信息(演员等) 。整个程序基于SQLite3和Python 2.7。Python - for loop过早退出

一切运作良好,除了我的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() 

问题是,循环在一次迭代后退出。

输出看起来是这样的:

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

因此,我认为,循环和函数调用是正确的(数据库中获取正确的更新 - 由“einlesen()”函数完成),但也有更多的迭代,不只是一个... 所以我的问题是:什么是错的? ;)

这里是(略) '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() 

感谢您的帮助。

回答

3

执行UPDATE而您仍在循环查看SELECT的结果。这会降低第一个cursor.execute()的结果。

使用第二个游标。

编辑:

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

cur1.execute("SELECT ...") 
for row in cur1: 
    cur2.execute("UPDATE ...") 
+0

感谢您的快速帮助! 我究竟如何创建另一个光标? –

+0

请参阅我的答案的编辑。 – 2012-09-04 08:02:05

+0

再次感谢!那个伎俩。 –