2013-05-21 2 views
-1

저는 mysql connector 1.0.9를 사용하고 있습니다. 및 Python 3.2파이썬과 mysql.connector는 부호없는 int의 인용 부호가 필요합니다

이 쿼리는 구문 오류 (mysql.connector throws ProgrammingError)로 인해 실패합니다. 특정 MySQL 오류는 "% (IP) s 및 DATE_SUB (NOW() 오른쪽에 구문 오류가 있습니다" , 간격 1 시간) < 액세스 "

SELECT COUNT(*) FROM bad_ip_logins WHERE IP = %(IP)s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed 

하지만 변수 IP를 인용하는 경우, 작동 :

IP = 1249764151 # IP converted to an int 
conn = mysql.connector.connect(db_params) 
curs = conn.cursor() 
query = "SELECT COUNT(*) FROM bad_ip_logins WHERE IP = %(IP)s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed" 
params = {'IP', IP} 
curs.execute(query, params) 
:

SELECT COUNT(*) FROM bad_ip_logins WHERE IP = '%(IP)s' AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed 

맥락에서

필자는 준비된 명령문에 대해 변수를 인용 할 필요가 없다는 점을 이해합니다 (이 코드는이 테이블의 IP 변수에 액세스하는 모든 쿼리에도 적용됩니다). 이 단일 인스턴스에서 다른 곳을 인용해야하는 이유는 무엇입니까?

만약 이것이 준비된 진술을하지 않는다면 나는 그것에 대해서도 듣고 싶을 것이다. 나는 이것으로 무엇이든 주입 할 수 없었습니다. 단지 그것을 막는 방법으로 그것을 인용 한 것입니까? 이 중요한 경우

,이 테이블의 설명은 다음과 같습니다

+----------+------------------+------+-----+---------+-------+ 
| Field | Type    | Null | Key | Default | Extra | 
+----------+------------------+------+-----+---------+-------+ 
| IP  | int(10) unsigned | YES |  | NULL |  | 
| user_id | int(11)   | YES |  | NULL |  | 
| accessed | datetime   | YES |  | NULL |  | 
+----------+------------------+------+-----+---------+-------+ 
+1

*이 문장을 사용하는 * Python * 코드는 무엇입니까? 예외의 전체 추적은 무엇입니까? –

+2

구문 오류 란 무엇입니까? – jpmc26

+0

실제로 자리 표시자가있는 준비된 문을 사용하고 있습니까? 왜냐하면 MySQL이 자리 표시자를 채우는 대신에 파이썬의'%'연산자를 잘못 사용하면 어떻게 될지 정확히 알 수 있기 때문입니다. (이것이 우리가 파이썬 코드를보아야하는 이유입니다.) – abarnert

답변

2

문자열 보간을 사용하지 마십시오. 여기

cursor.execute('''\ 
    SELECT COUNT(*) FROM bad_ip_logins WHERE IP = %s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed''', (ip,)) 

, 우리는 (그것을 순서 만들기 위해, 튜플에) 별도의 매개 변수로 execute() 호출에서 매개 변수 ip을 통과하고 데이터베이스 어댑터가 걸릴 것입니다 : 데이터베이스 어댑터에 SQL 매개 변수를 남겨 적절한 인용 부호를 사용하여 %s 자리 표시자를 채 웁니다.

관련 문제