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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

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

Q&A

解決済

2回答

1303閲覧

'where clause'が出るのが納得いかない

tami.py

総合スコア32

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

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

0グッド

0クリップ

投稿2022/06/21 09:52

sql =" update tb_worker set worker_delete = 1 where worker_id = worker_id1 "
上記の直前のところでworker_id1をprint(type(worker_id1))で出力すると<class 'str'>になっているので、プログラム上は、問題ないと思うのですが、下記のエラーになってしまいます。
worker_id1には、数字が入っています。sql =のworker_id1のところを’2’にしてやるとプログラムは、ちゃんと実行されました。

mysql.connector.errors.ProgrammingError: 1054 (42S22): Unknown column 'worker_id1' in 'where clause'

なんでこんなエラーになってしまったのか皆目見当もつきません。
どなたかご教授願います。

python3.9.10

1import tkinter as tk 2from tkinter import ttk 3import mysql.connector as mysql 4from tkinter import messagebox 5 6con = mysql.connect( 7database = 'seisan_system', 8user = 'root', 9password = 'mta969696', 10host = 'localhost', 11port = '3306', 12) 13 14 15 16# メインウィンドウの生成 17root = tk.Tk() 18root.title('作業者 一覧') 19root.geometry('380x400') 20 21# MYSQLからカラムの取得 22cur = con.cursor() 23sql= """ 24select worker_id, worker_name, worker_kana, worker_delete from tb_worker 25where worker_delete = 0 26 """ 27cur.execute(sql) 28rows= cur.fetchall() 29 30 31 32# カーソルでリスト内の一行を選択した際にその情報を保持するための関数 33def tree_selected(): 34 global worker_id1 35 global worker_name 36 global worker_kana 37 global worker_delete 38 39 worker_focus_id = tree.focus() 40 worker_focus = tree.item(worker_focus_id, "values") 41 42 worker_id1 = worker_focus[0] 43 worker_name = worker_focus[1] 44 worker_kana = worker_focus[2] 45 worker_delete = worker_focus[3] 46 print(type(worker_id1)) 47 print(type('2')) 48 print(worker_kana) 49 print(worker_delete) 50# 登録ボタンを押した際のテキストを読み取るgetメソッド 51def touroku_sql(): 52 worker_touroku = sql.get() #worker_form.py立ち上げる 53 54# 更新ボタンを押した際のテキストを読み取るgetメソッド 55def kousin_sql(): 56 worker_kousin = sql.get() 57 58# 削除ボタンを押した際のテキストを読み取るgetメソッド 59def sakujo_sql(): 60 cur = con.cursor() 61 print(type(worker_id1)) 62 # SQLを発行してDBへ登録 63 sql =" update tb_worker set worker_delete = 1 where worker_id = worker_id1 " 64 cur.execute(sql) 65 con.commit() 66 messagebox.showinfo("メッセージ", "削除しました") 67 cur.close() 68 con.close() 69 70 71# 画面を閉じる関数を与える 72def return_view(): 73 root.destroy() 74 75# 列の識別名を指定 76column = ('1', '2', '3') 77 78# Treeviewの生成 79tree = ttk.Treeview(root, columns=column) 80tree.grid(row=0, column=0, padx=10 ) 81# レコードの追加 82for i in rows: 83 tree.insert(parent='', index='end', values=(i)) 84# 列の設定 85tree.column('#0',width=0, stretch='no') 86tree.column('1', anchor='e', width=30) 87tree.column('2',anchor='w', width=140) 88tree.column('3', anchor='w', width=140) 89# 列の見出し設定 90tree.heading('#0',text='') 91tree.heading('1', text='ID',anchor='center') 92tree.heading('2', text='作業者 氏名', anchor='center') 93tree.heading('3',text='ふりがな', anchor='center') 94 95tree.bind('<<TreeviewSelect>>',lambda event: tree_selected()) 96 97 98# Scrollbar 99scrollbar = ttk.Scrollbar( 100 root, 101 command=tree.yview) 102tree['yscrollcommand'] = scrollbar.set 103scrollbar.grid(row=0, column=1, sticky=(tk.N, tk.S)) 104 105# ウィジェットの配置 106tree.grid(pady=10) 107 108 109# ボタン作成 110btn_touroku = tk.Button( 111 text='新規登録', width=8, command= touroku_sql ) 112btn_touroku.place(x=10, y=360) 113 114 115btn_kousin = tk.Button( 116 text='更新', width=8, command= kousin_sql ) 117btn_kousin.place(x=80, y=360) 118btn_delete = tk.Button( text='削除', width=8, command= sakujo_sql ) 119btn_delete.place(x=150, y=360) 120 121 122btn_end = tk.Button( 123 text='閉じる', width=8, command= return_view ) 124btn_end.place(x=220, y=360) 125 126root.mainloop() 127 128

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

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

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

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

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

guest

回答2

0

ベストアンサー

上記の直前のところでworker_id1をprint(type(worker_id1))で出力すると

テキストに書いてあるworker_id1は、変数としての解釈を受けません。ただ単に、書かれた通りのworker_id1として処理が進みます。

投稿2022/06/21 09:58

maisumakun

総合スコア145121

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

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

tami.py

2022/06/21 11:00

変数としての解釈を受けません。っていうところが、ポイントなんですね。 変数として受け取ってもらうための条件みたいなものがあるということですよね。 いつもプログラムを勉強してて、僕が、つまづいているところの一つなんだと思います。 うまくいく時といかない時の差が、ちっともわかりません。 エラーが出るたびにググったりして調べてはいるのですが、この部分が、ダメだ(今回でいうとworker_id1)というのは、わかるようになってきましたが、どう直せばいいのかは、一つ次元が違いますよね。 ちょっと直せば済むのか、はたまた、全くの見当違いでプログラムを大きく直さないといけないのかすらわからないので、苦労しています。 今回は、worker_id1を変数として受け取られるようにすればよいということなのでしょうか?
maisumakun

2022/06/21 11:06

> 今回は、worker_id1を変数として受け取られるようにすればよいということなのでしょうか? そちらへは進むべきではありません。SQLの「プレースホルダ」(バインド)について調べてみてください。
tami.py

2022/06/21 11:44

早速のご返信ありがとうございます。 --- sql =" update tb_worker set worker_delete= 1 where worker_id = '%s' " cur.execute(sql, worker_id1) --- にしてエラーが出なくなりました。 sql分に変数を危険なのですね。今後、気を付けていきます。 ProgrammingError: 1054は出なくなりましたが、 worker_delete = 1は、反応してくれず数字が書き換わらないという(涙
guest

0

update tb_worker set worker_delete = 1 where worker_id = worker_id1

これはtb_workerテーブルのworker_idカラムがworker_id1カラムと等しい場合
worker_deleteカラムの値を1にしろというSQL文です

投稿2022/06/21 09:55

yambejp

総合スコア114583

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

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

tami.py

2022/06/21 11:04

なるほど。worker_id1という単語?と等しいかどうかを見られているという解釈であっていますか? worker_id1内に含まれるデータではなく、worker_id1の文字そのものを認識しているということですよね? 表現の仕方は、maisumakunさんとは違えど、同じことを言っておられるわけですね。 どうすれば、変数として受け取ってもらえるのか・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問