Запрос базы данных Python MySQL Connector с% s не выполняется

У меня есть базовая программа, которая должна запрашивать базу данных, содержащую информацию о пользователях. Я пытаюсь выбрать информацию для конкретного пользователя и распечатать ее на консоли.

Вот мой код:

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))

У меня есть имя пользователя, хранящееся в переменной, потому что позже я планирую получить имя пользователя из поля ввода tkinter. Когда я выполняю этот код, я получаю следующую ошибку:

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

Я попытался поместить% s в кавычки в запросе, но затем он буквально ищет имена пользователей "% s" и ничего не возвращает. Как я могу изменить свой код, чтобы я мог запрашивать базу данных только для этого пользователя?

Спасибо.

К вашему сведению: я использую Python 3.3.


person Sebastian Bartholomew Charles    schedule 12.05.2014    source источник


Ответы (1)


Измените свой funcursor.execute(query, uName) вызов на:

funcursor.execute(query, (uName, ))

Второй аргумент в execute принимает список / кортеж строк, а не строку. Вышеупомянутый вызов создает кортеж перед передачей строки в execute, поэтому ошибки не возникает.

Причина, по которой execute принимает список / кортеж строк, заключается в том, что он заранее не знает, сколько строк ему нужно, чтобы удовлетворить ваш запрос.

person huu    schedule 12.05.2014
comment
Большое Вам спасибо. Это сработало. Но не могли бы вы объяснить, зачем нужна запятая? Я попробовал без запятой и получил ту же ошибку. - person Sebastian Bartholomew Charles; 12.05.2014
comment
Это потому, что execute ожидает список или кортеж значений в качестве второго аргумента. Запятая создает кортеж на месте, чтобы удовлетворить требования функции. execute не знает, сколько строк нужно заменить в запросе перед его чтением, и не хочет читать ваш запрос дважды. Таким образом, он просто запрашивает у вас запрос, а затем список или кортеж строк. Даже если вы хотите заменить только одну строку, вам нужно сначала превратить ее в список или кортеж, прежде чем передавать. - person huu; 12.05.2014
comment
В ПОРЯДКЕ. Спасибо за помощь. - person Sebastian Bartholomew Charles; 12.05.2014
comment
Спасибо за ответ, я выдергивала волосы. Похоже на плохое дизайнерское решение иметь конечную запятую + пробел: / - person Garbit; 14.12.2016