sql >> Databáze >  >> RDS >> Mysql

Chyba Pythonu a mySQLdb:OperationalError:(1054, Neznámý sloupec v klauzuli „where“)

Nepoužívejte "string injection" do vašeho SQL s výjimkou případů, kdy je to skutečně nezbytné, jako je str(DEPT) zde si můžete vybrat, ze kterého stolu vybíráte. Pro každý jiný případ použijte místo toho funkci předávání parametrů v Python DB API – bude za vás věci správně citovat a mimo jiné vás automaticky ochrání před útoky typu „SQL injection“. (Někdy to může být i rychlejší).

Protože MySQLdb používá nešťastnou notaci %s pokud jde o parametry, zde je to, co byste měli udělat (také opravit styl tak, aby vyhovoval PEP8, není vyžadováno, ale nemůže ublížit;-):

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 ve formátování řetězce, které vytváří q stát se jedním % každý při formátování, takže q je ponechán se dvěma výskyty %s -- které execute se úhledně vyplní správně naformátovanými verzemi CLASS a SEC . Všechny str hovory jsou nadbytečné atd.

Kromě toho, pokud používáte Python 2.6 nebo novější, pro formátování řetězců byste měli použít nový format namísto starého % operátor -- to vás kromě jiných výhod zbaví potřeby těch "zdvojených % znaků". Tuto změnu jsem ve výše uvedeném úryvku neaplikoval jen pro případ, že jste zůstali u verze 2.5 nebo starší (takže výše uvedený kód funguje v jakékoli verzi Pythonu, nikoli pouze v těch přiměřeně nejnovějších).



  1. SQL Server JSON_Modify, jak vše aktualizovat?

  2. Existuje způsob, jak porovnat IP s IP + CIDR přímo z dotazu SELECT?

  3. Získávání chyby PHP Varování:fputcsv() očekává, že parametr 2 bude pole

  4. Objekt třídy yii\db\Command nelze převést na řetězec