[Python3]SQLite3へUPDATEするときにループ(for)を使う方法


やりたいこと

先にSELECTを用いて元となるデータを取得したのち、forを使ってUPDATEをループしそれぞれ更新する

1回のみ実行されるプログラム

import sqlite3
n = 1
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
data = cursor.execute("select * from task")
for i in data:
    title = i[0]
    status = i[1]
    cursor.execute("update task set status=? where title=?", (status, title))
    cursor.close()
    conn.commit()
    print(n)
    n += 1

本来は・・・
- data = cursor.execute("select * from task")によって取得することを定義
- for i in dataで実行される
- 取得したリストdataをfor i in data:の部分で1文ずつ繰り返しながらUPDATE
- print(n)で処理回数を表示
するはずなのですが
出力は「1」としか出てこない

解決策まとめ

情報元

というわけで情報を検索して探していたところ見つけました。
python sqlite3 for loop update
先人に感謝です

解決策

data = data.fetchall()をループの前に追加するだけ
重要なのは.fetchall()の部分みたいです

修正後のプログラム

import sqlite3
n = 1
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
data = cursor.execute("select * from task")
#この後に追加する
data = data.fetchall()
for i in data:
    title = i[0]
    status = i[1]
    cursor.execute("update task set status=? where title=?", (status, title))
    cursor.close()
    conn.commit()
    print(n)
    n += 1

まとめ

SQLite3へUPDATEするときにループ(for)を使うには.fetchall()を、ループ前に入れる

なんとか解決できてよかったです。
情報が少なく、同じようなことで困っているけれどわからないって方がいたらと思って書きました。

最後までご覧いただきありがとうございました。