【sqlite3】for文を使用して、複数列に文字列を挿入したい。

デモなどで「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())

記事にするほどでもありませんでしたが、いつも通り、記録として残しておきます。