python mysql获取查询

时间:2009-09-11 20:20:40

标签: python mysql

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'

任何人都可以帮助我理解为什么我会收到此错误?

FYI:reg是函数getitem中来自用户的raw_input var i输入,并将reg var作为参数传递给此函数。

3 个答案:

答案 0 :(得分:3)

我认为这条线只是在错误的地方:

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

您对execute()和reg。

的结果使用%

将其更改为:

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

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

取决于它是否会为您进行param替换。

答案 1 :(得分:3)

这使得与MySQLDB一起工作的每个人都感到困惑。您正在将参数传递给execute函数,而不是执行python字符串替换。查询字符串中的%s更像是预处理语句而不是python字符串替换。这也可以防止SQL注入,因为MySQLDB将为您进行转义。如前所述(使用%和字符串替换),您很容易注入。

  1. 不要使用引号。 MySQLDB会把它们放在那里(如果需要的话)。
  2. 使用a而不是%。同样,您将一个元组作为参数传递给execute函数。

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

答案 2 :(得分:2)

你的括号错了:

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

使用fetchone进行循环的任何特殊原因(在这个丑陋的循环中,基于行数的范围在执行查询之前可能为零)?

只做

for car_info in self.dbc.fetchall():
    ....