1

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

我使用 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

可能的解决方案是什么?

4

1 回答 1

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 注入攻击,并让数据库有机会缓存​​查询的查询计划并插入未来的值。

于 2013-09-20T07:10:28.777 回答