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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

11466閲覧

Python SQliteについて。no such table というエラーが出てしまう。

退会済みユーザー

退会済みユーザー

総合スコア0

SQLite

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/02/17 10:26

編集2019/02/17 11:02

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

テーブルを生成できてないようなのですが、いくら検索をかけても自分の力では原因がわかりませんでした。
テーブルの定義の仕方が間違っているのでしょうか...

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/02/17 11:02

かしこまりました。ご指摘ありがとうございます。
toshi17922062

2019/02/17 13:34

SQliteの専門家ではないですが、 >テーブルの定義の仕方が間違っているのでしょうか まずはコマンド(ターミナル)でどんなテーブルが出来ているか、出来ていないか確認後、その定義文を流してみて、ちゃんとテーブルができるかどうかを確認したほうがよいのでは?要は切り分けです。 acc_dataはもとより、itemもできているかどうか、確認するのが先だと思います。 まずはプログラム化よりも、それぞれのSQLコマンドの実行確認が先で、確認がとれたら実装化すれば良いと思います。 もし仮に、たまたま解決策が出て今回上手くいっても、そういう基本は大事だと思いますよ。
firedfly

2019/02/17 14:40 編集

toshi17922062さんに同意です。 長大なコードを投げて答えてくれる人は限られます。 ・itemテーブルを作成して、できているか確認 ・itemテーブルに定型データを登録して、できているか確認 ・acc_dataテーブルを作成して、できているか確認 ・acc_dataテーブルに定型データを登録して、できているか確認 ここまでできてから、入力されたデータの登録に挑戦するという手順がおすすめです。 一気にコードを書けば間違いはいくつも入り込みますし どこまで正しいかさえわからないコードを直すのは大変です。
guest

回答1

0

こんにちは。

手元で実行したところ no such table: acc_data は発生しませんでした。
以下、3点修正してデータが登録されるところまで確認しました。

1.aac_date acc_date

Python

1 ddl = """ 2 CREATE TABLE acc_data 3 ( 4 id INTEGER PRIMARY KEY AUTOINCREMENT, 5 acc_date DATE NOT NULL, 6 item_code INTEGER NOT NULL, 7 amount INTEGER 8 ); 9 """

2.item_codeを追加

Python

1 c.execute(ddl) 2 c.execute("INSERT INTO item(item_code, item_name) VALUES(1, '食費');") 3 c.execute("INSERT INTO item(item_code, item_name) VALUES(2, '住宅費');") 4 c.execute("INSERT INTO item(item_code, item_name) VALUES(3, '光熱費');") 5 c.execute("COMMIT;")

3.[{}]{}

Python

1 c.execute(""" 2 INSERT INTO acc_data(acc_date,item_code,amount) 3 VALUES('{}',{},{}); 4 """.format(acc_date, item_code, amount))

以下、テストコード全文です。

Python

1import tkinter as tk 2import sqlite3 3 4#空のデータベースを作成→接続 5dbname = 'database.db' 6c = sqlite3.connect(dbname) 7c.execute("PRAGMA foreign_keys = 1") 8 9#データベース登録済み→ddlでの発行エラーをexceptブロックで回避 10try: 11 #itemテーブルの定義 12 ddl = """ 13 CREATE TABLE item 14 ( 15 item_code INTEGER PRIMARY KEY AUTOINCREMENT, 16 item_name TEXT NOT NULL UNIQUE 17 ); 18 """ 19 #SQLの発行 20 c.execute(ddl) 21 #acc_dataテーブルの定義 22 ddl = """ 23 CREATE TABLE acc_data 24 ( 25 id INTEGER PRIMARY KEY AUTOINCREMENT, 26 acc_date DATE NOT NULL, 27 item_code INTEGER NOT NULL, 28 amount INTEGER, 29 FOREIGN KEY(item_code) REFERENCES item(item_code) 30 ); 31 """ 32 #itemテーブルへリファランスデータの登録 33 c.execute(ddl) 34 c.execute("INSERT INTO item(item_code, item_name) VALUES(1, '食費');") 35 c.execute("INSERT INTO item(item_code, item_name) VALUES(2, '住宅費');") 36 c.execute("INSERT INTO item(item_code, item_name) VALUES(3, '光熱費');") 37 c.execute("COMMIT;") 38except Exception as e: 39 print(e) 40 41 42def create_sql(): 43 #日付の読み取り 44 acc_date = entrydy.get() 45 #内訳の読み取り 46 item_code = entrydt.get() 47 #金額の読み取り 48 amount = entrypr.get() 49 50 #SQL発行→DBへ登録 51 try: 52 c.execute(""" 53 INSERT INTO acc_data(acc_date,item_code,amount) 54 VALUES('{}',{},{}); 55 """.format(acc_date,item_code,amount)) 56 c.execute("COMMIT;") 57 print("1件登録しました。") 58 #登録できなかった場合(ドメインエラーなど) 59 except Exception as e: 60 print(e) 61 62 63root = tk.Tk() 64#ExpはExpenses(家計簿)の略称。 65root.title("Exp") 66root.geometry("300x300") 67 68#メニューバー 69frame = tk.LabelFrame(root,bd=2,relief="ridge",text="Menu") 70frame.pack(fill="x") 71 72#メニューバーのボタン 73button1 = tk.Button(frame,text="入力") 74button1.pack(side="left") 75button2 = tk.Button(frame,text="表示") 76button2.pack(side="left") 77button3 = tk.Button(frame,text= "終了") 78button3.pack(side="right") 79 80#入力画面ラベル 81labelmn = tk.Label(root,text="【入力画面】",font=("",16),height=2) 82labelmn.pack(fill="x") 83 84#日付ラベルとエントリー 85framedy = tk.Frame(root,pady=10) 86framedy.pack() 87labeldy = tk.Label(framedy,font=("",14),text="日付") 88labeldy.pack(side="left") 89entrydy = tk.Entry(framedy,font=("",14),justify="center",width=15) 90entrydy.pack(side="left") 91#内訳ラベルとエントリー(内訳はdetails) 92framedt = tk.Frame(root,pady=10) 93framedt.pack() 94labeldt = tk.Label(framedt,font=("",14),text="内訳") 95labeldt.pack(side="left") 96entrydt = tk.Entry(framedt,font=("",14),justify="center",width=15) 97entrydt.pack(side="left") 98#金額ラベルとエントリー(金額はprice) 99framepr = tk.Frame(root,pady=10) 100framepr.pack() 101labelpr = tk.Label(framepr,font=("",14),text="金額") 102labelpr.pack(side="left") 103entrypr = tk.Entry(framepr,font=("",14),justify="center",width=15) 104entrypr.pack(side="left") 105#登録ボタン 106buttonsb = tk.Button(root,text="登録",font=("",16),width=10,command=create_sql) 107buttonsb.pack(side="right") 108 109root.mainloop()

投稿2019/02/17 14:34

編集2019/02/17 14:44
firedfly

総合スコア1131

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問