1

我使用 Python,我得到一个“不正确的整数值:'(2L,)' for column 'id' at row 1”

这就是我所做的:

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

1 回答 1

3

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

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

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

指定 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))
于 2012-12-17T15:24:32.677 回答