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

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

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

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

Python 3.x

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

3031閲覧

Python3のTkinterとSQLite3の入力した文字のテーブル作成

Non-Face

総合スコア11

SQLite

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

Python 3.x

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

2クリップ

投稿2018/04/27 15:11

編集2018/04/28 08:09

前提・実現したいこと

現在Python3のTkinterとSQLite3で就活のために企業研究で集めた情報の管理ができるアプリケーションを作成しているところです。
そこでSQLite文、DBについて質問があります。
TkinterのEntryで会社名を"Google"と入力した場合Company_listという名前のテーブルにInsertし、同時に"Goggle"という名前のテーブルを作成したいのですが変数を使うとうまくいきません。
このエラーは二回目以降の実行によるものです。TkinterのEntryで入力した名前をcompanyに代入し、company(変数)という名前のテーブルを作成したいのですが変数ではないcompanyという名前のテーブルを作成してしまいます。変数をうまく使えていないことが原因だということはわかるのですが解決方法がわかりません。
SQL文のINSERTの中での変数の扱い方はご教示くださいました方法に変更しましたがCREATEの中での変数の扱いがわかりません。
この解決方法がわかる方教えていただけると助かります。
プログラミング初心者なためできるだけ易しい回答お待ちしています。よろしくお願いいたします。

発生している問題・エラーメッセージ

登録しました Exception in Tkinter callback Traceback (most recent call last): File "/home/USERNAME/anaconda3/lib/python3.6/tkinter/__init__.py", line 1699, in __call__ return self.func(*args) File "teratail.py", line 34, in registration_name Create table company(name TEXT, contents TEXT, memo TEXT)''') sqlite3.OperationalError: table company already exists

該当のソースコード

python

1from tkinter import * 2import sqlite3 3 4#データベース接続 5dbname="teratail.db" 6conn=sqlite3.connect(dbname) 7c=conn.cursor() 8 9#親テーブル作成 10try: 11 c.execute('''Drop table if exists company_list''') 12 c.execute(''' 13 Create table if not exists company_list 14 (company_name TEXT)''') 15 16 17except sqlite3.Error as e: 18 print('sqlite3.Error occurred:', e.args[0]) 19 20 21#登録ボタンを押した時 22def registration_name(): 23 company_name=entry_company_name.get() 24 25 c.execute(''' 26 Insert into company_list(company_name) 27 Values(?)''',(company_name,)) 28 c.execute("COMMIT") 29 print("登録しました") 30 31 company=entry_company_name.get() 32 33 c.execute(''' 34 Create table company(name TEXT, contents TEXT, memo TEXT)''') 35 c.execute('''Insert into company Values('給料','○○万円','○○含む')''') 36 print(company) 37 38 conn.commit() 39 40 41#Tkinterの操作 42root=Tk() 43root.geometry("600x600") 44 45entry_company_name=Entry(root, font=("",12)) 46entry_company_name.pack() 47 48button_registration=Button(root, text="登録", command=registration_name) 49button_registration.pack() 50 51root.mainloop()

試したこと

ご指摘を元に書き換えました。try:を一旦なくしエラーを表示させてみました。
このエラーは二回目以降の実行によるものになります。

補足情報(FW/ツールのバージョンなど)

本ページは一度編集しています。

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

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

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

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

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

KSwordOfHaste

2018/04/28 00:41

コード用のマークダウンを使えてるので半角スペースを'-'で表現する必要はないと思います。却って見づらくなるかも。コメントの中などコード用マークダウンが使えない箇所ではそういうテクニックを使う場合もありますけど。
Non-Face

2018/04/28 08:10

空白に変更いたしました。ありがとうございます。
guest

回答1

0

ベストアンサー

###SQLインジェクションを避ける
「SQLインジェクション」について調べてみてください。insertする箇所は通常次のように書くのが妥当と思います。

python

1 ... 2 company_name = ... 3 c.execute('insert into company_list(company_name) values(?)', 4 (company_name,))

pythonのリファレンスにも記述がありますよ。
https://docs.python.jp/3/library/sqlite3.html

###質問の仕方(現象を明記すべし)

変数を使うとうまくいきません。

「うまくいきません」と書かれても閲覧者には何がうまくいかないのかすぐにはわかりません。ご自分の質問文をよくみてください。下記はいったい何でしょうか?

---ここから---
###発生している問題・エラーメッセージ

エラーメッセージ

---ここまで---

これは質問テンプレートということは閲覧者にはわかります。そしてあなたが「それをまったく書かずにそのまんま質問ボタンを押してしまった」こともわかります。何割かの閲覧者はこの時点でこの質問をスルーすることでしょう。

何が起こったのか質問者さん自身が詳しく書くべき。それは大変重要です。

###質問の仕方(コードを縮めること)
短くするのは大変よいことです。しかし縮める際に「バグ」を入れ込んでしまっては何にもなりません。ご質問のコードには少なくとも3か所「意味が通じない点」があります。縮めた際のミスなのだろうと思います。

閲覧者は「問題部分をさっと見て回答できる」場合、コードが多少間違っていても気にせず回答してしまうこともなくはないですが、質問側の心構えとしてそういうことがないように改めた方がよいと思います。回答者はなるべく正確なコメントができるよう実際に実行してみて結果を確かめるということをよくやります。それに対して質問側が「やわらかーい」コードを書いてしまうとその回答者の努力を邪魔することになります。場合によっては「違う直し方をしたため質問者さんのミスに気づけない」ことだって起きるのです。

ちなみに自分には「質問者さん側で発生した現象」が分かりませんでしたけど、最初に書いたSQLの書き方についてコメントしておきました。現象がどうであれ間違いだと思ったからです。

鉄則:添付するコードは質問者さん自身で事前に実行し、問題としている現象が再現することを確認してください。実際にそうなることを確認するのはプログラマーの鉄則です。

投稿2018/04/28 02:30

KSwordOfHaste

総合スコア18392

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

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

Non-Face

2018/04/28 08:13

ご指摘いただきました箇所やその他の場所を変更させていただきました。お時間のある時で構いませんので確認していただけると幸いです。よろしくお願いいたします。
KSwordOfHaste

2018/04/28 08:54

原因は同じ名前のテーブルcompanyを2回create tableしているからです。 さて・・・普通DBのアプリケーションでは「任意の名前のテーブルを動的に生成する」ということはしません。どのテーブルを用いるかを実行時に決めるなんてことはしません。つまり複数の会社の情報を格納するにも同じテーブルを用います。異なる会社の情報を同一のテーブルに格納するようにし、会社を識別するカラムはユニークキーを用います。本件ならcompanyというテーブルを用いname, contents, memoといったカラムを定義しnameをユニークキーにします。特定の名前の会社情報を取り出す際には select * from company where name='google' という感じです。 以上のようなDBのテーブル設計の考え方(と基本的な正規化)についてもう少し学んでみることをお奨めします。
Non-Face

2018/04/28 13:33

なんとなくですがイメージをつかむことができましたので再度書きなおしてみます。またわからないことがありましたその都度teratailにて質問させていただきますのでまた機会がありましたご教示くださると幸いです。この度はお忙しい中ご丁寧に教えてくださりありがとうございました。とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問