我使用 Python,我得到一个“不正确的整数值:第 1 行的‘id’列的‘(2L,)’”
这就是我所做的:
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()
最佳答案
当可以使用 SQL 参数时,不要使用 str()
和字符串连接;此外,您的 userID
变量包含元组列表,而不是整数列表;您的函数必须将所有结果作为行返回。如果您有数据库游标引用,则以下内容将起作用:
cursor.execute("INSERT INTO user VALUES (%s, %s,'','');", (userID[0][0], user))
使用 SQL 参数还有一个额外的好处,即数据库适配器将对您传入的任何值应用正确的引号。例如,字符串将被引用,整数则不会,最重要的是,危险的 SQL 注入(inject)尝试将被阻止。
指定 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))
关于Python 不正确的整数值 : '(2L,)' for column 'id' at row 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13916928/