Python初心者になります。
こちらのページを参考に家計簿アプリを作成しています。ウィンドウは問題なく表示され、入力し登録ボタンを押すと以下のエラーが発生します。
コンソール上の表示
no such table: acc_data
該当のソースコード(sqliteの部分のみ)
Python3
1#空のデータベースを作成→接続 2dbname = 'database.db' 3c = sqlite3.connect(dbname) 4c.execute("PRAGMA foreign_keys = 1") 5 6#データベース登録済み→ddlでの発行エラーをexceptブロックで回避 7try: 8 #itemテーブルの定義 9 ddl = """ 10 CREATE TABLE item 11 ( 12 item_code INTEGER PRIMARY KEY AUTOINCREMENT, 13 item_name TEXT NOT NULL UNIQUE 14 ); 15 """ 16 #SQLの発行 17 c.execute(ddl) 18 #acc_dataテーブルの定義 19 ddl = """ 20 CREATE TABLE acc_data 21 ( 22 id INTEGER PRIMARY KEY AUTOINCREMENT, 23 aac_date DATE NOT NULL, 24 item_code INTEGER NOT NULL, 25 amount INTEGER, 26 FOREIGN KEY(item_code) REFERENCES item(item_code) 27 ); 28 """ 29 #itemテーブルへリファランスデータの登録 30 c.execute(ddl) 31 c.execute("INSERT INTO item(item_name) VALUES('食費');") 32 c.execute("INSERT INTO item(item_name) VALUES('住宅費');") 33 c.execute("INSERT INTO item(item_name) VALUES('光熱費');") 34 c.execute("COMMIT;") 35except: 36 pass 37 38#データをdbに登録 39def create_sql(): 40 #日付の読み取り 41 acc_date = entrydy.get() 42 #内訳の読み取り 43 item_code = entrydt.get() 44 #金額の読み取り 45 amount = entrypr.get() 46 47 #SQL発行→DBへ登録 48 try: 49 c.execute(""" 50 INSERT INTO acc_data(acc_date,item_code,amount) 51 VALUES('{}',[{}],{}); 52 """.format(acc_date,item_code,amount)) 53 c.execute("COMMIT;") 54 print("1件登録しました。") 55 #登録できなかった場合(ドメインエラーなど) 56 except Exception as e: 57 print(e)
#ソースコード全体
Python3
1#-*- coding: utf-8 -*- 2 3import tkinter as tk 4import sqlite3 5 6#空のデータベースを作成→接続 7dbname = 'database.db' 8c = sqlite3.connect(dbname) 9c.execute("PRAGMA foreign_keys = 1") 10 11#データベース登録済み→ddlでの発行エラーをexceptブロックで回避 12try: 13 #itemテーブルの定義 14 ddl = """ 15 CREATE TABLE item 16 ( 17 item_code INTEGER PRIMARY KEY AUTOINCREMENT, 18 item_name TEXT NOT NULL UNIQUE 19 ); 20 """ 21 #SQLの発行 22 c.execute(ddl) 23 #acc_dataテーブルの定義 24 ddl = """ 25 CREATE TABLE acc_data 26 ( 27 id INTEGER PRIMARY KEY AUTOINCREMENT, 28 aac_date DATE NOT NULL, 29 item_code INTEGER NOT NULL, 30 amount INTEGER, 31 FOREIGN KEY(item_code) REFERENCES item(item_code) 32 ); 33 """ 34 #itemテーブルへリファランスデータの登録 35 c.execute(ddl) 36 c.execute("INSERT INTO item(item_name) VALUES('食費');") 37 c.execute("INSERT INTO item(item_name) VALUES('住宅費');") 38 c.execute("INSERT INTO item(item_name) VALUES('光熱費');") 39 c.execute("COMMIT;") 40except: 41 pass 42 43#データをdbに登録 44def create_sql(): 45 #日付の読み取り 46 acc_date = entrydy.get() 47 #内訳の読み取り 48 item_code = entrydt.get() 49 #金額の読み取り 50 amount = entrypr.get() 51 52 #SQL発行→DBへ登録 53 try: 54 c.execute(""" 55 INSERT INTO acc_data(acc_date,item_code,amount) 56 VALUES('{}',[{}],{}); 57 """.format(acc_date,item_code,amount)) 58 c.execute("COMMIT;") 59 print("1件登録しました。") 60 #登録できなかった場合(ドメインエラーなど) 61 except Exception as e: 62 print(e) 63 64root = tk.Tk() 65#ExpはExpenses(家計簿)の略称。 66root.title("Exp") 67root.geometry("300x300") 68 69#メニューバー 70frame = tk.LabelFrame(root,bd=2,relief="ridge",text="Menu") 71frame.pack(fill="x") 72 73#メニューバーのボタン 74button1 = tk.Button(frame,text="入力") 75button1.pack(side="left") 76button2 = tk.Button(frame,text="表示") 77button2.pack(side="left") 78button3 = tk.Button(frame,text= "終了") 79button3.pack(side="right") 80 81#入力画面ラベル 82labelmn = tk.Label(root,text="【入力画面】",font=("",16),height=2) 83labelmn.pack(fill="x") 84 85#日付ラベルとエントリー 86framedy = tk.Frame(root,pady=10) 87framedy.pack() 88labeldy = tk.Label(framedy,font=("",14),text="日付") 89labeldy.pack(side="left") 90entrydy = tk.Entry(framedy,font=("",14),justify="center",width=15) 91entrydy.pack(side="left") 92#内訳ラベルとエントリー(内訳はdetails) 93framedt = tk.Frame(root,pady=10) 94framedt.pack() 95labeldt = tk.Label(framedt,font=("",14),text="内訳") 96labeldt.pack(side="left") 97entrydt = tk.Entry(framedt,font=("",14),justify="center",width=15) 98entrydt.pack(side="left") 99#金額ラベルとエントリー(金額はprice) 100framepr = tk.Frame(root,pady=10) 101framepr.pack() 102labelpr = tk.Label(framepr,font=("",14),text="金額") 103labelpr.pack(side="left") 104entrypr = tk.Entry(framepr,font=("",14),justify="center",width=15) 105entrypr.pack(side="left") 106#登録ボタン 107buttonsb = tk.Button(root,text="登録",font=("",16),width=10,command=create_sql) 108buttonsb.pack(side="right") 109 110root.mainloop() 111
テーブルを生成できてないようなのですが、いくら検索をかけても自分の力では原因がわかりませんでした。
テーブルの定義の仕方が間違っているのでしょうか...
URLは https://teratail.com/help#about-markdown の[リンク]に修正してください。

かしこまりました。ご指摘ありがとうございます。
SQliteの専門家ではないですが、
>テーブルの定義の仕方が間違っているのでしょうか
まずはコマンド(ターミナル)でどんなテーブルが出来ているか、出来ていないか確認後、その定義文を流してみて、ちゃんとテーブルができるかどうかを確認したほうがよいのでは?要は切り分けです。
acc_dataはもとより、itemもできているかどうか、確認するのが先だと思います。
まずはプログラム化よりも、それぞれのSQLコマンドの実行確認が先で、確認がとれたら実装化すれば良いと思います。
もし仮に、たまたま解決策が出て今回上手くいっても、そういう基本は大事だと思いますよ。
toshi17922062さんに同意です。
長大なコードを投げて答えてくれる人は限られます。
・itemテーブルを作成して、できているか確認
・itemテーブルに定型データを登録して、できているか確認
・acc_dataテーブルを作成して、できているか確認
・acc_dataテーブルに定型データを登録して、できているか確認
ここまでできてから、入力されたデータの登録に挑戦するという手順がおすすめです。
一気にコードを書けば間違いはいくつも入り込みますし
どこまで正しいかさえわからないコードを直すのは大変です。
