2010-08-11 2 views
3

모든 이봐, 난 오류파이썬과 mySQLdb 오류 : OperationalError (1054, " 'where 절'알 수없는 열")

OperationalError: (1054, "Unknown column 'XX' in 'where clause'")

받고 있어요 XX 다음 코드의 클래스의 값입니다

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

여기에 str(DEPT)과 같이 정말 필수적인 경우를 제외하고 SQL에 "string injection"을 사용하지 마십시오. 여기서 선택할 테이블을 선택할 수 있습니다. 다른 모든 경우에는 대신 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는 q을 생성하는 문자열 형식으로 각각 q에 두 개가 남는데 execute이 올바른 형식의 버전 CLASSSEC으로 깔끔하게 채워집니다. 으로부터 당신을 절약 - 파이썬 2.6 이상 인 경우 모든 str 호출은 이전 % 연산자 대신 새 format 방법을 사용해야합니다 서식 문자열을, 옆 등 AS를

, 중복 다른 이점들 중에서도 "% 기호를 두 배로 늘린"필요성이 있습니다. 위의 스 니펫에서 변경 사항을 적용하지 않았습니다. 2.5 또는 그 이전 버전이 붙어있는 경우에 대비하여 (위의 코드는 모든 버전의 Python에서 작동합니다.) 대신

+0

미안하지만, 나는 SQL 파이썬 정말 새로운 해요 :

course=%s 

나는 당신이 필요가 있다고 생각합니다. 거래가 너무 크지 않다면 매개 변수 전달이 무엇인지 설명해 주시겠습니까? 감사합니다. –

+0

감사합니다. Alex! 감사합니다. –

+0

@Jill, 확실하게 편집을 참조하십시오. 나는 단지 내 대답에 대한 편집을 보았습니다. - 코드를 수정하여 코드를 수정했습니다 (그리고 PEP8과 호환 됨). 과다한'str' 호출을 피함으로써 읽을 수 있지만, 그것들은 단지 여기에있는 측면 이슈이다. –

1

:

course='%s' 
+1

Alex의 답변이 더 나은 접근 방법입니다. – Shane

+0

아니, 내가 할 때 올바른 구문 오류가 발생합니다 : / –

관련 문제