質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Bottle

Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

945閲覧

bottleでtableを作る際に出てくるエラー「no such」を解消したい

bubblenet_

総合スコア2

Bottle

Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/30 13:46

編集2021/12/01 10:08

背景
pythonのwebフレームワークbottleで、ダイエット内容を記録するアプリを作っています。
作成最中で、デリート、アップデートをブラウザからできるようにするデコレーダ関数はまだ作っていません。。

解決したいこと
pythonファイルを起動し、「localhost:8080/ayad/init」にアクセスすると自動でデータベースとtableが作成されるよう作ったのですが、
OperationalError('no such table: deit')と表示がでてしまい、
データベースのみ作成され、テーブルが作成されません。
このエラーを解消して、テーブルを作成できるようにしたく、質問を投稿しました。

それ以外のエラー
またvisualstudio内では、33行目と42行目に以下の警告が出ています。
「"diet" is not defined」

調べたこと
sqliteで取り扱っていないデータ型を選択していないか調べたのですが、このwebアプリで使用しているデータ型は問題ありませんでした。

追記
ayad/initのinsert文をコメントアウトし、デバックを確認すると、ayad/initのところにのif文のところで「tableがない」となりました。
上記から、create構文でtableが作られてないことが原因と考えられます。
ayad/initのcreate構文はどこがエラーなのでしょうか…?

python

1import sqlite3 2from bottle import Bottle, post, get, request, route, run, template 3 4@route('/ayad/init') 5def init(): 6 7 con = sqlite3.connect('diet.db') 8 #con変数にconnectを入れる 9 10 drop_tb = 'DROP TABLE IF EXISTS diet_table' 11 #table削除 12 create_tb = 'CREATE TABLE diet_table('+\ 13 'id INTEGER PRIMARY KEY AUTOINCREMENT, '+\ 14 'time DATE, weight DOUBLE NOT NULL, step BIGINT NOT NULL, contents TEXT NOT NULL)' 15 #tableを作成 16 17 cur = con.cursor() 18 #カーソルを設定 19 20 cur.execute(drop_tb) 21 #もし既にbottleSがあれば削除する 22 23 cur.execute(create_tb) 24 #create_tb関数を呼び出し、executeで実行 25 #insert(cur, '', '1', '1', 'テスト') 26 27 con.commit() 28 #blist変数の中にtableの中の情報をすべて取得 29 blist =select_all(cur) 30 31 #DBとの接続を解除 32 con.close() 33 34 #%for~%endまでは登録した情報を表示する 35 if len(diet_table) > 0 : 36 tplt = """ 37 <p>テーブルbottlesを作成しました</p> 38 <p> 39 %for cell in diet_table[-1]: 40 {{cell}}, 41 %end 42 </p> 43 """ 44 return template(tplt, diet_table=diet_table) 45 46 return ('初期化操作失敗') 47 48@route('/ayad') 49def get_list(): 50 con = sqlite3.connect('diet.db') 51 cur = con.cursor() 52 blist = select_all(cur) 53 con.close() 54 tplt = """ 55 <h1>ダイエット記録</h1> 56 57 <p><a href='/ayad/new'>ダイエットを記録する</a></p> 58 <p><a href='/login'>管理者用</a></p> 59 <hr> 60 <table> 61 %for b in diet_table: 62 <tr> 63 <td>{{b[0]}}</td> 64 <td><a href='/ayad/{{b[0]}}'>{{b[1]}}</a></td> 65 </tr> 66 %end 67 </table> 68 """ 69 return template(tplt, diet_table=diet_table) 70 71#入力した情報の詳細を表示 72#↓ 73@route('/ayad/<id>') 74def show_detail(id): 75 con = sqlite3.connect('diet.db') 76 cur = con.cursor() 77 btl = select_by_id(cur, id) 78 con.close() 79 tplt = """ 80 <h1>データの詳細</h1> 81 <p><b>id: </b>{{btl[0]}}</p> 82 %for i in range(len(clms)): 83 <p><b>{{clms[i][1]}}: </b>{{btl[i+1]}}</p> 84 %end 85 <hr> 86 <p><a href='/ayad'>一覧に戻る</a></p> 87 """ 88 return template(tplt, clms = CLMS, btl = btl) 89 90@get('/ayad/new') 91def new(): 92 tplt = """ 93 <h1>データの新規作成</h1> 94 <form action ='/ayad/new' method = 'POST'> 95 <p>日程<br><input type="date" name="time"></p> 96 <p>体重<br><input type="number" name="weight"></p> 97 <p>歩数<br><input type="number" name="step"></p> 98 <p>我慢したこと/筋トレ内容<br><textarea name="contents" rows="4" cols="60"></textarea></p> 99 <input type='submit' value='GO'> 100 </form> 101 """ 102 return template(tplt) 103#データを入力する/データの渡し先は/blist/new method = POSTに指定されている 104 105@post('/ayad/new') 106def added_new(): 107 time=request.forms.get('time') 108 weight=request.forms.get('weight') 109 step=request.forms.get('step') 110 contents=request.forms.getunicode('contents') 111 112 con = sqlite3.connect('diet.db') 113 cur = con.cursor() 114 115 insert(cur, time, weight, step, contents) 116 con.commit() 117 118 blist= select_all(cur) 119 con.close() 120 121 tplt = """ 122 <h1>データを保存しました</h1> 123 """ + detail_template() 124 return template(tplt, clms=CLMS, btl = diet_table[-1]) 125 126 127def detail_template(): 128 tplt = """ 129 <p><b>id: </b>{{btl[0]}}</p> 130 %for i in range(len(clms)): 131 <p><b>{{clms[i][0]}}: </b>{{btl[i+1]}}</p> 132 %end 133 <hr> 134 <p><a href='/ayad'>一覧に戻る</a></p> 135 <p><a href='/ayad/update/{{btl[0]}}'>データを更新</a></p> 136 <p><a href='/ayad/delete/{{btl[0]}}'>データを削除</a></p> 137 """ 138 return tplt 139 140 141 142 143def insert(cur, time, weight, step, contents): 144 insert_str = 'INSERT INTO deit_table(time, weight, step, contents)' +\ 145 'VALUES (?,?,?,?)' 146 cur.execute(insert_str, (time, weight, step, contents)) 147 148def select_all (cur): 149 select_str = 'SELECT * FROM diet_table' 150 cur.execute(select_str) 151 return cur.fetchall() 152 153def select_by_id(cur, id): 154 select_str = 'SELECT * FROM diet_table WHERE id= ?' 155 cur.execute(select_str, id) 156 return cur.fetchone() 157 158def update(cur, id, time, weight, step, contents): 159 upd_str = 'UPDATE diet_table SET time=?, weight=?, step=?, contents=? WHERE id =?' 160 cur.execute(upd_str, (time, weight, step, contents, id) ) 161 162def delete(cur, id): 163 delete_str = 'DELETE FROM diet_table where id=?' 164 cur.execute(delete_str, id) 165 166CLMS=[('time', '日付'), ('weight', '体重'), ('step', '歩数'), ('contents', '内容')] 167 168run(host='localhost', port=8080, reloader=True, debug=True)

備考
デバックは以下のようになります。
「> File "C:\Users\bubbl\AppData\Local\Programs\Python\Python310\lib\site-packages\bottle.py", line 868, in _handle
return route.call(**args)
File "C:\Users\bubbl\AppData\Local\Programs\Python\Python310\lib\site-packages\bottle.py", line 1748, in wrapper
rv = callback(*a, **ka)
File "C:\Users\bubbl\Desktop\aya_diet\aya_diet.py", line 23, in init
insert(cur, '', '1', '1', 'テスト')
File "C:\Users\bubbl\Desktop\aya_diet\aya_diet.py", line 144, in insert
cur.execute(insert_str, (time, weight, step, contents))
sqlite3.OperationalError: no such table: deit
127.0.0.1 - - [30/Nov/2021 22:27:41] "GET /ayad/init HTTP/1.1" 500 1615」

長文申し訳ありません、助力いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ざっとしかコード見ていませんが、テーブル名はdietではなくdiet_tableではないでしょうか。
また、コード中の変数blistdietdiet_tableなどに混乱が見られるようです。
それぞれの変数がコード中のどこで定義されて何を指しているモノなのかを見直してみてください。

投稿2021/12/01 01:20

can110

総合スコア38278

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bubblenet_

2021/12/01 03:49

can110さん、先日に引き続きご教授ありがとうございます。 上記の通り、コード内の変数におかしな点が無いか帰宅したら確認してみます。 ちなみに、変数が原因でTableが作成されないことってありますでしょうか?
bubblenet_

2021/12/01 10:06

can110さん、ご指摘の通りコード内の変数を見直しました。 blist:select_all(cur)を格納する変数 diet:diet_tableに変更しました。 diet_table:diet.db内に作成されるはずのtable と定義しました。 ※質問文のコードも修正しました。 すると、エラーが35行目のif文で「NameError: name 'diet_table' is not defined」と出ました。 やはり、diet.db内にtableが作られていないことが原因だと考えられますが、tableが作られない原因がわかりません。。 予約語の確認も致しました。 たびたび回答していただいて恐縮ではありますが、御教授いただけると幸いです。
can110

2021/12/01 10:15

pythonコードでの変数名とDB上の(SQL文上の)テーブル名とは全く別のものです。diet_tableという変数は定義されていないのでそのエラーが発生しています。 また、私の回答での指摘はSQL文で 「CREATE TABLE diet_table~」「SELECT * FROM diet~」と異なるテーブル名を使っている(間違っている)のでは?ということです。
bubblenet_

2021/12/01 11:05

ご返信ありがとうございます。 ご指摘の通り、コードを修正したのですが(修正後のコードを質問に記載しました。)、 やはりエラーは消えませんでした。。
can110

2021/12/01 11:20

エラー文「sqlite3.OperationalError: no such table: deit」と コード上の「CREATE TABLE diet_table~」と 「INSERT INTO deit_table~」 それぞれテーブル名が違います(よね?)。 どこがおかしいのか、しっかり確認してみてください。
bubblenet_

2021/12/01 16:20

ご返信ありがとうございます、 エラーを更新していませんでした…。 紛らわしいことをして申し訳ないです…
bubblenet_

2021/12/01 16:26

一度テーブル作成に成功したファイルで、 カラムの編集をしたら成功しました。 しかし、元々作成していたファイルで何故エラーが起きたのかわかりません… diet変数を全てdiet_tableに修正したところ、やはり35行目のif文でエラーが出ました。 しかし、出たエラーはネームエラーでdiet_tableは定義されていない、という内容でした。
can110

2021/12/02 08:44

状況がよく分かりません。 > 何故エラーが起きたのかわかりません… テーブル名が間違っていたのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問