2016-12-05 6 views
3

私は、学生の出席を記録するテーブルを持っています。表には学生ID用と週1、週2、週3の4つの列があります(すべての列は整数です)。出席は、特定の週に1回だけ入力することで記録されます(不在の場合はゼロ)。あなたが見ることができるようにPython、MYSQLデータベース

week_number=input('enter the week (week1/week2/week3') 
id=int(input('enter student ID')) 
sat="UPDATE Attendance2 SET %s=1 WHERE ID=%s " 
cur.execute(sat, (week_number,id,)) 
conn.commit() 

が、私は、ユーザーが参照する列が(それが何であるかを知らない:私は次のように更新ステートメントを使用して出席を追加したい時に私の問題は、ここにあります変数)、私は%sの後ろにSETを使用したが、それは間違っています。ここで

は誤りです:

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''week1'=1 WHERE ID=300' at line 1 

任意のヘルプしてください?実行文に変数の列名を書き込むにはどうすればよいですか?私が唯一参加し、学生を更新しています

注意、

答えて

0

AFAICTでは、キーを引用符で囲むことができます。しかし、すべてのデータ型が整数であると言っても、値に問題はありません。

そして、これは文法上のエラーであり(列の問題ではなく、week1が見つからない場合)、それは問題が実際にあなたの引用であると信じるようになります。もしmysqlのSQL文法では、それは本当に構文の問題について叫ぶだろう。

mysql […] near ''week1'=1 WHERE ID=300' at line 1 
       ^

何がpython文字列を単一引用符で囲みますか?私は、この問題があなたに起こる理由はわからない

>>> x = '42' 
>>> x 
'42' 
>>> print(repr(x)) 
'42' 
>>> print(x) 
42 

:それは、文字列のrepr()バージョン、あなたはREPL上の文字列を入力するときあなたが得る一つです。フォーマット文字列のPythonのフォームを使用し、実行することをおideais:

sat="UPDATE Attendance2 SET {}=1 WHERE ID={}".format(week_number, id) 

それはまだ発生した場合、あなたはstr(week_number)を使用して、str()week_numberのタイピングを強制しようとすることができます。

フォーマット文字列について話す、あなたは驚きを避けるため、タイピングを強制する場合があります

sat="UPDATE Attendance2 SET {:s}=1 WHERE ID={:d}".format(str(week_number), int(id)) 

week_numberが有効な文字列であることを確認し、文字列として書式になります、とidは有効な整数であります整数としてフォーマットされています。

注意ベーネ:pythonの予約キーワードで、あなたのコードでidの使用を避け、代わりに_ididentまたはidxを使用しています。グローバルなpythonキーワードのシャドーを避けることは、常に良い考えです。

HTH

+1

Hmm ... Bobby Tablesのように見えるかもしれません。 – cwallenpoole

+0

みんな♥ボビーテーブル! BTW @ahmedは、可能性のある注入からあなたの入力をチェックし、保護することを決して忘れない。あなたのコードで、ユーザーが ';出席者2から削除1 = 1; - あなたが釘付けになるかもしれない。スマートにして、ホイールを改革しようとするのではなく、既存のライブラリを使ってあなたを批判したり、SQLAlchemyのような適切なORMを使用したりしてください。 – zmo

+1

私はちょうどこれは私の最初のpythonとMYSQLコードの初心者です。ご清聴ありがとうございました。 – ahmed

0

は、このことができます

sat="UPDATE Attendance2 SET " + week_number + "='1' WHERE ID='" + student_id + "'" 
cur.execute(sat) 
... 

希望^^試みるUPDATE文の1が存在する理由です - D

PS:それはあるが、変数week_numberとstudent_idを「ハードワイヤード」に設定すると、コードをテストするのが簡単になります。例:

week_number = "week1" 
student_id = "1" 

PPS:あなたのテーブルをデザインする方法は少し冗長で、将来的には更新エラーにつながる可能性があります。例えば、 student_idとattended_week(1,2,3のように)を持つ2列テーブルを持つ方がよいでしょう。

+0

ありがとうございました。 Unfortenetly、最初のオプションは、私は、このエラーを与える:週(week1/week2/week3)week1 が学生ID300 トレースバック(最新の呼び出しの最後)を入力を入力します。 = "UPDATE Attendance2 SET" + WEEK_NUMBER +「= '座っ1 'WHERE ID =' "+ id +" '" TypeError:' int 'オブジェクトをstrに暗黙的に変換できません.2番目のオプションでこのエラーが発生します:mysql.connector.errors。 SQL構文にエラーがあります。 '' week1 '=' 1 'の近くで使用する正しい構文については、MySQLサーバのバージョンに対応するマニュアルを確認してください。WHERE ID =' 300 '' 1行目 – ahmed

関連する問題