質問編集履歴

1 URLの表記の仕方を変更

inchoXD

inchoXD score 10

2019/02/17 20:02  投稿

Python SQliteについて。no such table というエラーが出てしまう。
Python初心者になります。
こちらのページ(http://memopy.hatenadiary.jp/entry/2017/05/30/223555)を参考に家計簿アプリを作成しています。ウィンドウは問題なく表示され、入力し登録ボタンを押すと以下のエラーが発生します。
[こちらのページ](http://memopy.hatenadiary.jp/entry/2017/05/30/223555)を参考に家計簿アプリを作成しています。ウィンドウは問題なく表示され、入力し登録ボタンを押すと以下のエラーが発生します。
### コンソール上の表示
```
no such table: acc_data
```
### 該当のソースコード(sqliteの部分のみ)
```Python3
#空のデータベースを作成→接続
dbname = 'database.db'
c = sqlite3.connect(dbname)
c.execute("PRAGMA foreign_keys = 1")
#データベース登録済み→ddlでの発行エラーをexceptブロックで回避
try:
   #itemテーブルの定義
   ddl = """
   CREATE TABLE item
   (
       item_code INTEGER PRIMARY KEY AUTOINCREMENT,
       item_name TEXT NOT NULL UNIQUE
   );
   """
   #SQLの発行
   c.execute(ddl)
   #acc_dataテーブルの定義
   ddl = """
   CREATE TABLE acc_data
   (
       id INTEGER PRIMARY KEY AUTOINCREMENT,
       aac_date DATE NOT NULL,
       item_code INTEGER NOT NULL,
       amount INTEGER,
       FOREIGN KEY(item_code) REFERENCES item(item_code)
   );
   """
   #itemテーブルへリファランスデータの登録
   c.execute(ddl)
   c.execute("INSERT INTO item(item_name) VALUES('食費');")
   c.execute("INSERT INTO item(item_name) VALUES('住宅費');")
   c.execute("INSERT INTO item(item_name) VALUES('光熱費');")
   c.execute("COMMIT;")
except:
   pass
#データをdbに登録
def create_sql():
   #日付の読み取り
   acc_date = entrydy.get()
   #内訳の読み取り
   item_code = entrydt.get()
   #金額の読み取り
   amount = entrypr.get()
   #SQL発行→DBへ登録
   try:
       c.execute("""
       INSERT INTO acc_data(acc_date,item_code,amount)
       VALUES('{}',[{}],{});
       """.format(acc_date,item_code,amount))
       c.execute("COMMIT;")
       print("1件登録しました。")
   #登録できなかった場合(ドメインエラーなど)
   except Exception as e:
       print(e)
```
#ソースコード全体
```Python3
#-*- coding: utf-8 -*-
import tkinter as tk
import sqlite3
#空のデータベースを作成→接続
dbname = 'database.db'
c = sqlite3.connect(dbname)
c.execute("PRAGMA foreign_keys = 1")
#データベース登録済み→ddlでの発行エラーをexceptブロックで回避
try:
   #itemテーブルの定義
   ddl = """
   CREATE TABLE item
   (
       item_code INTEGER PRIMARY KEY AUTOINCREMENT,
       item_name TEXT NOT NULL UNIQUE
   );
   """
   #SQLの発行
   c.execute(ddl)
   #acc_dataテーブルの定義
   ddl = """
   CREATE TABLE acc_data
   (
       id INTEGER PRIMARY KEY AUTOINCREMENT,
       aac_date DATE NOT NULL,
       item_code INTEGER NOT NULL,
       amount INTEGER,
       FOREIGN KEY(item_code) REFERENCES item(item_code)
   );
   """
   #itemテーブルへリファランスデータの登録
   c.execute(ddl)
   c.execute("INSERT INTO item(item_name) VALUES('食費');")
   c.execute("INSERT INTO item(item_name) VALUES('住宅費');")
   c.execute("INSERT INTO item(item_name) VALUES('光熱費');")
   c.execute("COMMIT;")
except:
   pass
#データをdbに登録
def create_sql():
   #日付の読み取り
   acc_date = entrydy.get()
   #内訳の読み取り
   item_code = entrydt.get()
   #金額の読み取り
   amount = entrypr.get()
   #SQL発行→DBへ登録
   try:
       c.execute("""
       INSERT INTO acc_data(acc_date,item_code,amount)
       VALUES('{}',[{}],{});
       """.format(acc_date,item_code,amount))
       c.execute("COMMIT;")
       print("1件登録しました。")
   #登録できなかった場合(ドメインエラーなど)
   except Exception as e:
       print(e)
root = tk.Tk()
#ExpはExpenses(家計簿)の略称。
root.title("Exp")
root.geometry("300x300")
#メニューバー
frame = tk.LabelFrame(root,bd=2,relief="ridge",text="Menu")
frame.pack(fill="x")
#メニューバーのボタン
button1 = tk.Button(frame,text="入力")
button1.pack(side="left")
button2 = tk.Button(frame,text="表示")
button2.pack(side="left")
button3 = tk.Button(frame,text= "終了")
button3.pack(side="right")
#入力画面ラベル
labelmn = tk.Label(root,text="【入力画面】",font=("",16),height=2)
labelmn.pack(fill="x")
#日付ラベルとエントリー
framedy = tk.Frame(root,pady=10)
framedy.pack()
labeldy = tk.Label(framedy,font=("",14),text="日付")
labeldy.pack(side="left")
entrydy = tk.Entry(framedy,font=("",14),justify="center",width=15)
entrydy.pack(side="left")
#内訳ラベルとエントリー(内訳はdetails)
framedt = tk.Frame(root,pady=10)
framedt.pack()
labeldt = tk.Label(framedt,font=("",14),text="内訳")
labeldt.pack(side="left")
entrydt = tk.Entry(framedt,font=("",14),justify="center",width=15)
entrydt.pack(side="left")
#金額ラベルとエントリー(金額はprice)
framepr = tk.Frame(root,pady=10)
framepr.pack()
labelpr = tk.Label(framepr,font=("",14),text="金額")
labelpr.pack(side="left")
entrypr = tk.Entry(framepr,font=("",14),justify="center",width=15)
entrypr.pack(side="left")
#登録ボタン
buttonsb = tk.Button(root,text="登録",font=("",16),width=10,command=create_sql)
buttonsb.pack(side="right")
root.mainloop()
```
テーブルを生成できてないようなのですが、いくら検索をかけても自分の力では原因がわかりませんでした。
テーブルの定義の仕方が間違っているのでしょうか...
  • SQLite

    1082 questions

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

  • Python 3.x

    15006 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る