저는 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 | |
+----------+------------------+------+-----+---------+-------+
*이 문장을 사용하는 * Python * 코드는 무엇입니까? 예외의 전체 추적은 무엇입니까? –
구문 오류 란 무엇입니까? – jpmc26
실제로 자리 표시자가있는 준비된 문을 사용하고 있습니까? 왜냐하면 MySQL이 자리 표시자를 채우는 대신에 파이썬의'%'연산자를 잘못 사용하면 어떻게 될지 정확히 알 수 있기 때문입니다. (이것이 우리가 파이썬 코드를보아야하는 이유입니다.) – abarnert