我使用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()
答案 0 :(得分:3)
当您可以使用SQL参数时,请不要使用str()
和字符串连接;另外,您的userID
变量包含元组列表,而不是整数列表;您的函数必须将所有结果作为行返回。如果您有数据库游标引用,则以下内容将起作用:
cursor.execute("INSERT INTO user VALUES (%s, %s,'','');", (userID[0][0], user))
使用SQL参数还有一个额外的好处,即数据库适配器会将正确的引用应用于您传入的任何值。例如,字符串将被引用,而不是整数,最重要的是,会阻止危险的SQL注入尝试。 / p>
指定SQL参数的确切语法取决于您的数据库适配器。我使用%s
样式位置参数(因为您使用了mysql标记),但根据数据库适配器,可以支持以下任何一种:
?
位置参数%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))