Python MySQL запрос выборки - PullRequest
       8

Python MySQL запрос выборки

2 голосов
/ 12 сентября 2009
def dispcar ( self, reg ):
                print ("The car information for '%s' is: "), (reg)
                numrows = int(self.dbc.rowcount) #get the count of total rows
                self.dbc.execute("select * from car where reg='%s'") %(reg)
                for x in range(0, numrows):
                    car_info = self.dbc.fetchone()
                    print row[0], "-->", row[1]

код выше выдает эту ошибку:

self.dbc.execute("select * from car where reg='%s' " %(reg)
TypeError: unsupported operand type(s) for %: 'long' and 'str'

Может кто-нибудь помочь мне понять, почему я получаю эту ошибку?

К вашему сведению: reg - это необработанный ввод var i от пользователя в функции getitem и передача reg var в качестве аргумента этой функции.

Ответы [ 3 ]

3 голосов
/ 12 сентября 2009

Это смущает практически всех, кто работает с MySQLDB. Вы передаете аргументы в функцию execute, а не делаете подстановку строки Python. % S в строке запроса используется скорее как подготовленный оператор, чем как подстановка строки python. Это также предотвращает внедрение SQL-кода, поскольку MySQLDB сделает переход за вас. Как и раньше (с использованием% и подстановки строк), вы уязвимы для инъекций.

  1. Не используйте кавычки. MySQLDB поместит их туда (при необходимости).
  2. Используйте вместо%. Опять же, вы передаете кортеж в качестве аргумента функции execute.

    self.dbc.execute («выберите * из машины, где reg =% s», (reg,))

3 голосов
/ 12 сентября 2009

Я думаю, что у этой строки просто есть символы в неправильном месте:

self.dbc.execute("select * from car where reg='%s'") %(reg)

Вы используете% по результату execute () и рег.

Измените его на:

self.dbc.execute("select * from car where reg='%s'" % reg)

или

self.dbc.execute("select * from car where reg='%s'", reg)

в зависимости от того, будет ли он выполнять замену параметра для вас.

2 голосов
/ 12 сентября 2009

Вы ошиблись в скобках:

self.dbc.execute("select * from car where reg=%s" , (reg,))

Есть ли какая-то конкретная причина, по которой вы выполняете цикл с использованием fetchone (в этом уродливом цикле с диапазоном, основанным на количестве строк, которое, вероятно, будет равно нулю, как вы его получите, прежде чем выполнить запрос)?

Просто сделай

for car_info in self.dbc.fetchall():
    ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...