5

사용자 정보가 들어있는 데이터베이스를 쿼리하기로되어있는 기본 프로그램이 있습니다. 특정 사용자의 정보를 선택하여 콘솔로 출력하려고합니다. 나중에 내가 Tkinter를 입력 상자에서 사용자 이름을 얻기 계획 때문에이 변수에 저장된 사용자 이름이% s가있는 Python MySQL Connector 데이터베이스 쿼리가 실패합니다.

import mysql.connector 

funcon = mysql.connector.connect(user='root', password='pass', host='127.0.0.1', database='fundata') 
funcursor = funcon.cursor() 

query = ("SELECT * FROM funtable WHERE userName=%s") 
uName = 'user1' 

funcursor.execute(query, uName) 

for (userName) in funcursor: 
    print("{}".format(userName)) 

:

여기 내 코드입니다. 나는 %의 쿼리에 따옴표를 넣어 시도했지만 그때는 말 그대로 사용자 이름 '% s'이 (가) 검색하고 아무 것도 반환하지 않습니다

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s' at line 1 

:이 코드를 실행하면 나는 다음과 같은 오류가 발생합니다. 이 사용자 만 데이터베이스를 쿼리 할 수 ​​있도록 코드를 어떻게 변경합니까?

감사합니다.

참고 : 저는 python 3.3을 사용하고 있습니다.

답변

14
는에 funcursor.execute(query, uName) 전화를 변경

:

funcursor.execute(query, (uName,)) 

execute의 두 번째 인수는 문자열 목록/튜플이 아닌 문자열을 사용합니다. 위의 호출은 문자열을 execute으로 전달하기 전에 튜플을 생성하므로 오류가 발생하지 않습니다.

execute이 문자열의 목록/튜플을 차지하는 이유는 쿼리를 만족시키기 위해 필요한 문자열의 수를 미리 알 수 없기 때문입니다.

+0

대단히 감사합니다. 이것은 효과가 있었다. 그래도 쉼표가 필요한 이유를 설명해 주시겠습니까? 쉼표없이 시도하고 같은 오류가 발생했습니다. –

+1

'execute'은 두 번째 인자로 값의리스트 나 튜플을 기대하기 때문입니다. 쉼표는 그 자리에서 튜플을 생성하므로 함수의 요구 사항을 다룹니다. 'execute'는 그것을 읽기 전에 쿼리에서 얼마나 많은 문자열을 대체해야 하는지를 알지 못하며, 쿼리를 두 번 읽는 것을 원하지 않습니다. 그래서 그것은 당신에게 질의를 한 다음 문자열의리스트 또는 튜플을 묻습니다. 한 문자열 만 바꾸려는 경우에도이를 전달하기 전에 목록이나 터플로 만들어야합니다. – huu

+0

OK. 도와 주셔서 감사합니다. –