我是Python和MySQL的新手所以我正在使用只读帐户进行练习。我试图创建一个可执行脚本,基本上要求一个名字,姓氏,然后将它们插入查询并返回结果。以下是我的内容和错误:
cur = conn.cursor()
user_input_fname = raw_input("Enter Trainer First Name: ")
user_input_lname = raw_input("Enter Trainer Last Name: ")
cur.execute(" SELECT concat(u.firstname, ' ', u.lastname) AS clientName, us.sessionid AS sessionID, convert_tz(s.starttime, '+00:00', '+04:00') AS sessionTimeEST, concat(t.firstname, ' ', t.lastname) AS trainerName FROM usersessions us LEFT JOIN users u ON us.userid = u.id INNER JOIN sessions s ON us.sessionid = s.id INNER JOIN trainers t ON s.trainerid = t.id WHERE u.firstname = %s AND u.lastname =%s ORDER BY s.starttime;' " %(user_input_fname, user_input_lname))
data = cur.fetchall()
cur.close()
conn.close()
错误:pymysql.err.InternalError:(1054,你"未知栏' ethan' in ' where where'")
我觉得这是一个'或"在某个地方失踪,但我无法弄清楚我的语法错误。
答案 0 :(得分:0)
sql中的字符串文字必须由'
或"
括起来。您在where
子句中提供了名称,因此这些名称应包含在其中一个语音标记中:
...WHERE u.firstname = '%s' AND u.lastname ='%s'...
在sql语句结束之前还有一个尾随单引号。如果这确实存在于您的代码中,则必须将其删除。
答案 1 :(得分:0)
不建议使用字符串插值(即%
运算符)将这些值放入查询中,因为它可能导致SQL注入攻击(取决于数据的来源)。
如果将这些参数传递给execute方法,它会更安全(并且还会修复引用问题)。
即。而是称之为:
cur.execute("""
SELECT concat(u.firstname, ' ', u.lastname) AS clientName, us.sessionid AS sessionID, convert_tz(s.starttime, '+00:00', '+04:00') AS sessionTimeEST, concat(t.firstname, ' ', t.lastname) AS trainerName
FROM usersessions us LEFT JOIN users u ON us.userid = u.id
INNER JOIN sessions s ON us.sessionid = s.id
INNER JOIN trainers t ON s.trainerid = t.id
WHERE u.firstname = %s AND u.lastname =%s
ORDER BY s.starttime;
""", (user_input_fname, user_input_lname))
然后让MySQL库安全地引用您认为合适的输入。