2010-12-17 6 views
2

私はsqlite3のファイルにいくつかのデータを変更しようと私のpythonでの私の非既存の知識をして-FUグーグルのですが、私はこのコードで終わる作られた:"c.execute(...)"がループを壊すのはなぜですか?

#!/usr/bin/python 
# Filename : hello.py 

from sqlite3 import * 

conn = connect('database') 

c = conn.cursor() 

c.execute('select * from table limit 2') 

for row in c: 
    newname = row[1] 
    newname = newname[:-3]+"hello" 
    newdata = "UPDATE table SET name = '" + newname + "', originalPath = '' WHERE id = '" + str(row[0]) + "'" 
    print row 
    c.execute(newdata) 
    conn.commit() 
c.close() 

それは、1行目の魔法のように動作します何らかの理由でループを1回だけ実行します(テーブルの最初の行のみが変更されます)。 "c.execute(newdata)"を削除すると、テーブルの最初の2行がループされます。私はそれをどのように機能させるのですか?

答えて

3

c.execute(newdata)を実行するとすぐにカーソルがもはや元の結果セットを指していないためです。私はこのようにします:

#!/usr/bin/python 
# Filename : hello.py 

from sqlite3 import * 

conn = connect('database') 

c = conn.cursor() 

c.execute('select * from table limit 2') 
result = c.fetchall() 

for row in result: 
    newname = row[1] 
    newname = newname[:-3]+"hello" 
    newdata = "UPDATE table SET name = '" + newname + "', originalPath = '' WHERE id = '" + str(row[0]) + "'" 
    print row 
    c.execute(newdata) 
conn.commit()  
c.close() 
conn.close() 
1

c.execute(newdata)を呼び出すと、for row in c:がすぐに終了するようにカーソルcが変更されます。

試してみてください。

c = conn.cursor() 
c2 = conn.cursor() 

c.execute('select * from table limit 2') 

for row in c: 
    newname = row[1] 
    newname = newname[:-3]+"hello" 
    newdata = "UPDATE table SET name = '" + newname + "', originalPath = '' WHERE id = '" + str(row[0]) + "'" 
    print row 
    c2.execute(newdata) 
    conn.commit() 
c2.close() 
c.close() 
+0

あなたは本当に2つのカーソルは必要ありませんか?最初の実行呼び出しの結果を保存し、それを繰り返すだけです。 –

+0

@マット:「LIMIT 2」に気付かなかった。あなたが正しい。 – sje397

0

ループ内に「c」を再利用する「c」を無効にするので、あなたは、ループイテレータとして使用しています。ループ内のクエリに対して別のカーソルを作成します。

0

更新を実行するために同じカーソルを使用していますが、Updateはcの行がfalseになるように行を返しません。

関連する問題