Mysql
 sql >> база данни >  >> RDS >> Mysql

Грешка в Python и mySQLdb:OperationalError:(1054, Неизвестна колона в клаузата Where)

Не използвайте „инжектиране на низ“ във вашия SQL, освен в случаите, когато това е наистина необходимо, като str(DEPT) тук, за да изберете от каква таблица избирате. За всеки друг случай използвайте вместо това функцията за предаване на параметри на API на Python DB – тя ще цитира правилно нещата вместо вас и автоматично ще ви защити от атаки с „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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Връзка на приложение за Android Studio с mysql

  2. Използване на FORCE INDEX с zend

  3. създаване на тригер в различни бази данни

  4. Как да възстановим данни от MySQL .frm?

  5. Ruby, Rails:mysql2 gem, някой използва ли този скъпоценен камък? Стабилен ли е?