Python不正确的整数值:'(2L,)'表示第1行的列'id'

时间:2012-12-17 15:22:57

标签: python mysql

我使用Python,我得到一个“不正确的整数值:'(2L,)'用于第1行的列'id'”

这就是我做的事情:

for user in users:
            userID = self.selectQuery("SELECT COUNT(id) FROM user;")
            self.changeQuery("INSERT INTO user VALUES ('" + str(userID[0]) + "', '" + str(user) + "','','');")

def changeQuery (self, query):

    connection = MySQLdb.connect(self.mysql_host, self.mysql_user, self.mysql_password, self.mysql_db)
    cursor = connection.cursor()
    cursor.execute (query)
    connection.commit()
    cursor.close()
    connection.close()

1 个答案:

答案 0 :(得分:3)

当您可以使用SQL参数时,请不要使用str()和字符串连接;另外,您的userID变量包含元组列表,而不是整数列表;您的函数必须将所有结果作为行返回。如果您有数据库游标引用,则以下内容将起作用:

cursor.execute("INSERT INTO user VALUES (%s, %s,'','');", (userID[0][0], user))

使用SQL参数还有一个额外的好处,即数据库适配器会将正确的引用应用于您传入的任何值。例如,字符串将被引用,而不是整数,最重要的是,会阻止危险的SQL注入尝试。 / p>

指定SQL参数的确切语法取决于您的数据库适配器。我使用%s样式位置参数(因为您使用了标记),但根据数据库适配器,可以支持以下任何一种:

  • ?位置参数
  • %s位置参数(例如,使用我的MySQLdb)
  • :name已命名参数
  • %(name)s已命名参数

检查数据库适配器文档以获取支持的确切变体。

在您的情况下发生的事情是userID[0]是包含python长整数的元组,其字符串表示包含L。您的数据库即使没有接受您的查询,也不会接受您的查询,因为您假设所有输入值都是字符串,并且无论如何都要在值周围加上引号。查询期望整数的字符串"0"将不起作用。

将此推断为扩展函数:

def changeQuery(self, query, parameters=()):    
    connection = MySQLdb.connect(self.mysql_host, self.mysql_user, self.mysql_password, self.mysql_db)
    cursor = connection.cursor()
    cursor.execute(query, parameters)
    connection.commit()
    cursor.close()
    connection.close()

并致电:

self.changeQuery("INSERT INTO user VALUES (%s, %s,'','');", (userID[0][0], user))