Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Błąd Pythona i mySQLdb:OperationalError:(1054, nieznana kolumna w klauzuli where)

Nie używaj „wstrzykiwania ciągów” do kodu SQL, z wyjątkiem przypadków, w których jest to naprawdę niezbędne, takich jak str(DEPT) tutaj, aby wybrać stół, z którego wybierasz. W każdym innym przypadku zamiast tego użyj funkcji przekazywania parametrów w Python DB API — będzie ona właściwie cytować i automatycznie bronić Cię między innymi przed atakami typu „wstrzyknięcie SQL”. (Czasami może być też szybciej).

Ponieważ MySQLdb używa niefortunnej notacji %s jeśli chodzi o parametry, oto co powinieneś zrobić (także naprawienie stylu, aby był zgodny z PEP8, nie jest to wymagane, ale nie zaszkodzi;-):

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 w formatowaniu ciągu, które daje q stać się pojedynczym % każdy po formatowaniu, więc q pozostały dwa wystąpienia %s -- które execute wypełnia się ładnie poprawnie sformatowanymi wersjami CLASS i SEC . Wszystkie str połączenia są zbędne itp.

Na marginesie, jeśli korzystasz z Pythona 2.6 lub nowszego, do formatowania ciągów powinieneś użyć nowego format metoda zamiast starego % operator - to oszczędza ci między innymi korzyściami "podwojonych znaków %". Nie zastosowałem tej zmiany w powyższym fragmencie na wypadek, gdybyś utknął z wersją 2.5 lub wcześniejszą (więc powyższy kod działa w dowolnej wersji Pythona, a nie tylko w całkiem nowych).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyzwalacze MySQL i SUM()

  2. PHP nie działa na serwerze

  3. Symfony2, Doctrine2, MySql, przeglądaj tabele

  4. mysqli lub PDO - jakie są plusy i minusy?

  5. Jak wyświetlić datę w formacie ISO 8601 za pomocą PHP