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

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

ただいまの
回答率

90.61%

  • Python 3.x

    5926questions

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

  • データベース

    685questions

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

  • SQLite

    605questions

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

  • Tkinter

    137questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 247

Non-Face

score 3

 前提・実現したいこと

現在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

 該当のソースコード

from tkinter import *
import sqlite3

#データベース接続
dbname="teratail.db"
conn=sqlite3.connect(dbname)
c=conn.cursor()

#親テーブル作成
try:
    c.execute('''Drop table if exists company_list''')
    c.execute('''
    Create table if not exists company_list
    (company_name TEXT)''')


except sqlite3.Error as e:
    print('sqlite3.Error occurred:', e.args[0])


#登録ボタンを押した時
def registration_name():
    company_name=entry_company_name.get()

    c.execute('''
    Insert into company_list(company_name)
    Values(?)''',(company_name,))
    c.execute("COMMIT")
    print("登録しました")

    company=entry_company_name.get()

    c.execute('''
    Create table company(name TEXT, contents TEXT, memo TEXT)''')
    c.execute('''Insert into company Values('給料','○○万円','○○含む')''')
    print(company)

    conn.commit()


#Tkinterの操作
root=Tk()
root.geometry("600x600")

entry_company_name=Entry(root, font=("",12))
entry_company_name.pack()

button_registration=Button(root, text="登録", command=registration_name)
button_registration.pack()

root.mainloop()

 試したこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • KSwordOfHaste

    2018/04/28 09:41

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

    キャンセル

  • Non-Face

    2018/04/28 17:10

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

    キャンセル

回答 1

checkベストアンサー

+1

SQLインジェクションを避ける

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

    ...
    company_name = ...
    c.execute('insert into company_list(company_name) values(?)',
              (company_name,))


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

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

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

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

---ここから---

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

エラーメッセージ


---ここまで---

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

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

質問の仕方(コードを縮めること)

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/28 17:13

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

    キャンセル

  • 2018/04/28 17:54

    原因は同じ名前のテーブルcompanyを2回create tableしているからです。

    さて・・・普通DBのアプリケーションでは「任意の名前のテーブルを動的に生成する」ということはしません。どのテーブルを用いるかを実行時に決めるなんてことはしません。つまり複数の会社の情報を格納するにも同じテーブルを用います。異なる会社の情報を同一のテーブルに格納するようにし、会社を識別するカラムはユニークキーを用います。本件ならcompanyというテーブルを用いname, contents, memoといったカラムを定義しnameをユニークキーにします。特定の名前の会社情報を取り出す際には
    select * from company where name='google'
    という感じです。

    以上のようなDBのテーブル設計の考え方(と基本的な正規化)についてもう少し学んでみることをお奨めします。

    キャンセル

  • 2018/04/28 22:33

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5926questions

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

  • データベース

    685questions

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

  • SQLite

    605questions

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

  • Tkinter

    137questions

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