回答編集履歴

2 連番を付与

firedfly

firedfly score 1099

2019/02/17 23:44  投稿

こんにちは。
手元で実行したところ `no such table: acc_data` は発生しませんでした。
以下、3点修正してデータが登録されるところまで確認しました。
1. `aac_date ` → `acc_date `
1.`aac_date ` → `acc_date `
```Python
   ddl = """
   CREATE TABLE acc_data
   (
       id INTEGER PRIMARY KEY AUTOINCREMENT,
       acc_date DATE NOT NULL,
       item_code INTEGER NOT NULL,
       amount INTEGER
   );
   """
```
1. item_codeを追加
2.item_codeを追加
```Python
   c.execute(ddl)
   c.execute("INSERT INTO item(item_code, item_name) VALUES(1, '食費');")
   c.execute("INSERT INTO item(item_code, item_name) VALUES(2, '住宅費');")
   c.execute("INSERT INTO item(item_code, item_name) VALUES(3, '光熱費');")
   c.execute("COMMIT;")
```
1. `[{}]` → `{}`
3.`[{}]` → `{}`
```Python
       c.execute("""
       INSERT INTO acc_data(acc_date,item_code,amount)
       VALUES('{}',{},{});
       """.format(acc_date, item_code, amount))
```
以下、テストコード全文です。
```Python
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,
       acc_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_code, item_name) VALUES(1, '食費');")
   c.execute("INSERT INTO item(item_code, item_name) VALUES(2, '住宅費');")
   c.execute("INSERT INTO item(item_code, item_name) VALUES(3, '光熱費');")
   c.execute("COMMIT;")
except Exception as e:
   print(e)
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()
```
1 item_codeが数値だったので微修正

firedfly

firedfly score 1099

2019/02/17 23:41  投稿

こんにちは。
手元で実行したところ `no such table: acc_data` は発生しませんでした。
以下、3点修正してデータが登録されるところまで確認しました。
1. `aac_date ` → `acc_date `
```Python
   ddl = """
   CREATE TABLE acc_data
   (
       id INTEGER PRIMARY KEY AUTOINCREMENT,
       acc_date DATE NOT NULL,
       item_code INTEGER NOT NULL,
       amount INTEGER
   );
   """
```
1. item_codeを追加
```Python
   c.execute(ddl)
   c.execute("INSERT INTO item(item_code, item_name) VALUES(1, '食費');")
   c.execute("INSERT INTO item(item_code, item_name) VALUES(2, '住宅費');")
   c.execute("INSERT INTO item(item_code, item_name) VALUES(3, '光熱費');")
   c.execute("COMMIT;")
```
1. `[{}]` → `'{}'`
1. `[{}]` → `{}`
```Python
       c.execute("""
       INSERT INTO acc_data(acc_date,item_code,amount)
       VALUES('{}','{}',{});
       VALUES('{}',{},{});
       """.format(acc_date, item_code, amount))
```
以下、テストコード全文です。
```Python
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,
       acc_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_code, item_name) VALUES(1, '食費');")
   c.execute("INSERT INTO item(item_code, item_name) VALUES(2, '住宅費');")
   c.execute("INSERT INTO item(item_code, item_name) VALUES(3, '光熱費');")
   c.execute("COMMIT;")
except Exception as e:
   print(e)
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('{}','{}',{});
       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()
```

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