用户提供的信息很少,例如用户在配置文件中提供的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_ID
和rank_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
可能的解决方案是什么?
答案 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注入攻击,并为数据库提供缓存查询的查询计划的机会,并且只是插入未来的值。