pythonのBottleフレームワークを使用してデータベースの処理を書いた時、
エラーでハマったので記録として残す。
near "(": syntax error について
エラー文
以下のようなエラーが出た。
sqlite3.OperationalError: near "(": syntax error
書いていた処理
# 既にデータベースとテーブルは作成済み
def store(content):
conn = sqlite3.connect(dbname)
c = conn.cursor()
print(content)
insert = 'insert into data(status) values(?)' # ここがおかしい
c.execute(insert, (content,))
:
:
原因
insert文のinto (data)
がおかしい。よくわからないコードを書いている。。。
エラーの見方
(
の近くでエラーが発生しているという意味なので、
(
付近を確認して、変な書き方のコードがないか確認する。
Incorrect number of bindings supplied... について
エラー文
以下のエラーが発生した。
Incorrect number of bindings supplied. The current statement uses 1, and there are 4 supplied.
書いていた処理
# 既にデータベースとテーブルは作成済み
def store(content):
conn = sqlite3.connect(dbname)
c = conn.cursor()
print(content)
insert = 'insert into data(status) values(?)'
c.execute(insert, (content)) # ここがおかしい
:
:
原因
execute文がおかしい。正しくは以下の通り。
※content
の後に,
が必要。
c.execute(insert, (content,))
エラーの見方
insert文の?の数と、execute文の第二引数に指定した値の数が合わないという意味。
プリペアードステートメント(?)を使用する場合、タプルで値を渡さないといけない。
タプルの要素が1つの場合、末尾に,
が必要!
参考サイト
・insert文の書き方
https://products.sint.co.jp/topsic/blog/sql-insert
・Incorrect number of bindings supplied...の対処法
https://techracho.bpsinc.jp/baba/2010_07_16/2130
・プリペアードステートメントの書き方
https://dev.classmethod.jp/articles/query-with-mysql-connector-python/
・要素が1個のタプルの解説
https://note.nkmk.me/python-tuple-single-empty/