デモなどで「INSERT INTO」文でデータベースに複数列入れることがよくあると思います。しかし、実践ではfor文も組み込んで行うことがあると思いますが、デモではあまりありません。
以下のコードのようにfor文の中に「INSERT INTO」文をを組み込んで、実行するとエラーが発生します。
import sqlite3
conn = sqlite3.connect("test22.db")
cur = conn.cursor()
url = ["https://lifeinfo-navi.com/p=2977","https://lifeinfo-navi.com/p=2513","https://lifeinfo-navi.com/"]
cur.execute('CREATE TABLE pre(id INTEGER PRIMARY KEY AUTOINCREMENT ,url_col TEXT,pre_col TEXT)')
sql = 'INSERT INTO pre(url_col,pre_col) VALUES(?,?)'
for i in range (0,len(url)):
cur.execute('INSERT INTO pre(url_col,pre_col)VALUES(url[i],url[i])')
time.sleep(1)
cur.execute('SELECT * FROM pre')
print(cur.fetchall())
結果:OperationalError: near "[i]": syntax error こちらの記事を書きながら、思い出しましたが、確か8行目のVALUESに変数を入れるときは「?」にするんでしたっけ? やっぱりでした。 以下のように修正すると成功しました。
import sqlite3
conn = sqlite3.connect("test23.db")
cur = conn.cursor()
url = ["https://lifeinfo-navi.com/p=2977","https://lifeinfo-navi.com/p=2513","https://lifeinfo-navi.com/"]
cur.execute('CREATE TABLE pre(id INTEGER PRIMARY KEY AUTOINCREMENT ,url_col TEXT,pre_col TEXT)')
sql_insert = ('INSERT INTO pre(url_col,pre_col)VALUES(?,?)')
for i in range (0,len(url)):
cur.execute(sql_insert,(url[i],url[i],))
time.sleep(1)
cur.execute('SELECT * FROM pre')
print(cur.fetchall())
記事にするほどでもありませんでしたが、いつも通り、記録として残しておきます。