Ошибка Python и mySQLdb: OperationalError: (1054, «Неизвестный столбец в предложении where») - PullRequest
4 голосов
/ 12 августа 2010

Привет всем, я получаю сообщение об ошибке

OperationalError: (1054, "Неизвестный столбец 'XX' в 'выражении where'")

Где 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, если это поможет

Спасибо!

Ответы [ 3 ]

6 голосов
/ 12 августа 2010

Не используйте «ввод строки» в ваш SQL, за исключением случаев, когда это действительно необходимо, например, str(DEPT) здесь, чтобы выбрать, из какой таблицы вы выбираете. В любом другом случае используйте вместо этого функцию передачи параметров API-интерфейса DB Python - он будет правильно для вас заключать в кавычки и автоматически защищать вас от атак «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 в строковом форматировании, которое производит q, становится единым % каждый при форматировании, поэтому q остается с двумя вхождениями %s - которые execute аккуратно заполняет с правильно отформатированными версиями CLASS и SEC. Все вызовы str являются избыточными и т. Д.

Кроме того, если вы работаете на Python 2.6 или более поздней версии, для форматирования строк вы должны использовать новый метод format вместо старого оператора % - это избавляет вас от необходимости "удваивать" % знаки ", среди других преимуществ. Я не применял это изменение в приведенном выше фрагменте на тот случай, если вы застряли с версией 2.5 или более ранней (поэтому приведенный выше код работает в любой версии Python, а не только в достаточно недавней).

1 голос
/ 12 августа 2010

Вместо:

course=%s

Я думаю, вам нужно:

course='%s'
0 голосов
/ 11 июня 2018

У меня была такая же ошибка, я просто добавил новое поле в мою модель и таблицу т.е. поле id. и он работает правильно.

...