5

やあ、エラーが発生しました

OperationalError:(1054、"'where句'の不明な列'XX'")

ここで、XXは次のコードのCLASSの値です。

conn = MySQLdb.connect(host = "localhost",user = "user", passwd = "pass",db = "dbase")
cursor = conn.cursor()
cursor.execute("""SELECT * FROM %s WHERE course =%s AND sec = %s""" % (str(DEPT),str(CLASS),str(SEC),))

問題は、特定の値でのみこのエラーが発生することです。つまり、CLASSに文字が含まれている場合です。それが助けになるなら、私はテーブルをvarcharとして設定しています

ありがとう!

4

3 に答える 3

6

str(DEPT)SQLに「文字列インジェクション」を使用しないでください。ただし、ここで選択するテーブルを選択するなど、本当に不可欠な場合を除きます。それ以外の場合は、代わりにPython DB APIのパラメーター受け渡し機能を使用してください。これにより、適切に引用され、「SQLインジェクション」攻撃などから自動的に防御されます。(場合によっては、より高速になることもあります)。

MySQLdbは%sパラメータに不幸な表記法を使用しているため、次のことを行う必要があります(PEP8に準拠するようにスタイルを修正します。必須ではありませんが、害はありません;-):

conn = MySQLdb.connect(host="localhost", user="user", passwd="pass", db="dbase")
cursor = conn.cursor()
q = 'SELECT * FROM %s WHERE course=%%s AND sec = %%s""" % (DEPT,)
cursor.execute(q, (CLASS, SEC))

%%生成される文字列フォーマットのsは、フォーマット時にそれぞれq1つになるため、 -の2つのオカレンスが残ります。これは、との正しくフォーマットされたバージョンできれいに埋められます。すべての呼び出しは冗長です。%q%sexecuteCLASSSECstr

余談ですが、Python 2.6以降を使用している場合、文字列の書式設定formatには、古い演算子の代わりに新しいメソッドを使用%する必要があります。これにより、「%記号を2倍にする」などの利点がなくなります。2.5以前で立ち往生している場合に備えて、上記のスニペットにその変更を適用していません(したがって、上記のコードは、かなり最近のバージョンではなく、どのバージョンのPythonでも機能します)。

于 2010-08-11T21:00:16.917 に答える
1

それ以外の:

course=%s

私はあなたが必要だと思います:

course='%s'
于 2010-08-11T21:03:37.997 に答える
0

同じエラーが発生しました。モデルとテーブルに新しいフィールドを追加しました。idフィールド。そしてそれはきちんと働いています。

于 2018-06-11T05:18:38.690 に答える