Python TypeError:无法连接'str'和'long'对象

时间:2013-09-20 07:07:15

标签: python mysql

用户提供的信息很少,例如用户在配置文件中提供的usernamepasswordemail等。

我使用configParser模块从配置文件中获取解析数据。

我想将这些信息输入MySQL数据库。

数据如下:

Usename="ABC"
password="ABC@1"
email="abc123@xyz.com"

我的插入语句如下:

"INSERT INTO userinfo (group_ID, rank_ID, login, password, first_name, last_name, email) VALUES ('" + groupid + "', '" + rankID + "', '" + userid + "', '" + password + "', '" + fname + "', '" + lname + "', '" + email + "')"

但它没有执行,因为我收到错误:

TypeError: cannot concatenate 'str' and 'long' objects

对于混合类型的变量,我尝试过:str(password)str(email),但没有运气。

此处,group_IDrank_ID是整数。

我按照其中一位专家的建议尝试了以下内容:

sql = "INSERT INTO userinfo (group_ID, rank_ID, login, password, first_name, last_name, email) "
"VALUES (%s, %s, %s, %s, %s, %s, %s)",
(groupid, rankID, userid, password, fname, lname, email)
try:
  c.execute(sql4)
  conn.commit()
except StandardError, e:
  print e
  conn.rollback()

但我得到的错误是:query() argument 1 must be string or read-only buffer, not tuple

可能的解决方案是什么?

1 个答案:

答案 0 :(得分:4)

请勿自行将值插入查询中。使用SQL参数将其保留到数据库适配器:

cursor.execute(
    "INSERT INTO userinfo (group_ID, rank_ID, login, password, first_name, last_name, email) "
    "VALUES (%s, %s, %s, %s, %s, %s, %s)",
    (groupid, rankID, userid, password, fname, lname, email))

标准Python-MySQL适配器使用%s作为参数占位符,其他数据库适配器可以使用?代替。

这具有额外的优势,MySQL将为您找出如何引用每个值,防止SQL注入攻击,并为数据库提供缓存查询的查询计划的机会,并且只是插入未来的值。